変数[冗長]でコマンドを実行する

変数[冗長]でコマンドを実行する

人々は変数を使用するときに二重引用符で囲む必要があるとよく言います。

次の例では、コマンドを変数に入れてecho "You can't see me"実行し、出力をYou can't see me。これが究極の目標です。

$ cmd="echo \"You can't see me\""
$ echo "$cmd"
echo "You can't see me"
$ $cmd
"You can't see me"
$ "$cmd"
echo "You can't see me": command not found

だから$cmd私はそれを実行しましたが、私がしたくない二重引用符が含まれていて、二重引用符変数に関するアドバイスに従ってエラーが発生しました。

リソースには推奨事項に例外があると記載されていますが、推奨事項にも例外がありますか?いつも使用する必要がありますか?

eval "$cmd"私は実行(または二重引用符なし)または実行後に出力の適切な変換(二重引用符なし)を実行して目的の結果を取得する方法を知っていますが、$cmdこの問題をどのように回避できますか?

答え1

人々はしばしばこう言います。

実はリソースたとえば...

盲目的に「アドバイス」に従わないでください。カーゴカルトプログラミングを「正しく」実行する方法はありません。 bash(1) マンページや標準仕様などの主要な「リソース」はありますか?

文字列をスクリプトフラグメントとして評価するには、次のevalものを使用する必要があります。

cmd="echo \"You can't see me\""
eval "$cmd"

引用符を持たない変数を使用すると、その拡張子に一重引用符や二重引用符などのシェルメタ文字があるかどうかを再検索し、再分析せずに変数の文字に分割してグローバルに拡張します(または文字がIFS含まれている場合)。*?[

cmd="echo \"What's a *? \""

eval "$cmd"
What's a *?

$cmd
"What's a [all the files in your directory] "

最後の例では、cmd拡張された後、、、およびechoに分割され、グローバルに拡張され、他のすべての文字列が引数として実行され、空白(および一部"What'saシェルでは)に関連付けられた標準出力として印刷されます*?。他のエスケープはその引数でも解釈されます)。"*?echoecho\n

関連情報