2016-04-18 18 views
1

を失敗します。その後、私は与えられたオプションと引数を指定してこのコマンドを実行したいは、シェルスクリプトからコマンドを実行し、私はこのような行が含まれているファイル読み取りしようとしている

Run COMMAND with options "OPTIONS" and arguments "ARGUMENTS" 

を。たとえば、私は、これらのコマンドを実行したいと思います:

Run pwd with options "" and arguments "" 
Run ls with options "-al" and arguments "$HOME" 
Run ls with options "-al" and arguments "Example: \"strange folder name\"" 

これは

#!/bin/bash 

while read -r line 
do 
COMMAND=$(echo "$line" | cut -d" " -f 2) 
OPTIONS=$(echo "$line" | cut -d" " -f 5 | tr -d '"') 
ARGUMENTS=$(echo "$line" | cut -d" " -f 8) 

$COMMAND $OPTIONS $ARGUMENTS 
done <$1 

最初の例は、それは、二番目は私にエラーls: cannot access $HOME: No such file or directory'を与えている必要があり、三番目が保存されていないとして働いている私のコードですフォルダ名は$ARGUMENTSに正しく設定されています。

+1

このように 'cut'を使わないでください。あなたのコードは、 'read -rコマンド中のオプションと同じです。 ... done'(但し、これは変数に 'a'、' b'、 'c'を割り当てます)。 –

+0

@WilliamPursellの提案は、より良い方法です。コードをさらに読みやすく自己文書化するために、不要な変数をignoreという名前の変数に置き換えることができます。read -r ignore COMMAND ignore ignore OPTIONS ignore ignore ARGUMENTS; ... done'。 – alvits

答えて

1

もう一つは私にエラーLSを与えていない:$ HOMEにアクセスすることはできません:そのようなファイルやディレクトリん」を

$HOMEという名前のフォルダが存在しないためです。私は$HOME変数の値については言及していませんが、文字列リテラルです。あなたの状況では、シェルはパラメータ拡張を実行しません。

三番目が正しく

-f 8のみの列8を取り出すためです$引数へのフォルダの名前を格納していない、の終わりまで第八列と他のすべてを抽出するために-f 8-を試してみてくださいライン。

あなたは以下のこのバージョンに試してみることができます。evalが該当する場合、ARGUMENTSのパラメータ展開を可能にするために使用されている組み込みコマンドシェルである

while read -r line; do 
    COMMAND=$(printf "%s" "${line}" | cut -d" " -f 2) 
    OPTIONS=$(printf "%s" "${line}" | cut -d" " -f 5 | tr -d '"') 
    ARGUMENTS=$(printf "%s" "${line}" | cut -d" " -f 8-) 
    $COMMAND $OPTIONS "$(eval printf \"%s\" "$ARGUMENTS")" 
done < "${1}" 

私は、evalが通常危険であると言っていることを警告する必要があります。

関連する問題