ls
提供された引数を使用してコマンドを実行するスクリプトを作成したいと思います。なぜ動作しないのですか?例を使って実行してみた-R
ところ、エコーが発生しました(比較のために同じ内容をエコーしました)。
ls "-R"
しかし、 '-R'にアクセスできないと言います。そのファイルやディレクトリはありません。しかし、ls "-R"
端末で実行すると動作します。
スクリプト自体:
text='ls'
while [[ $# -gt 0 ]]
do
text+=' "'
text+=$1
text+='"'
shift
done
echo 'ls "-R"'
echo $text
$text
答え1
誤った引用が問題です。"
変数に含まれている場合は引用しません(ここで問題は削除されません!)。例外:eval $text
パラメータを配列に割り当て、代わりにls "${vars[@]}"
orを使用する必要がありますls "$@"
。
2 つの呼び出しを比較します。
set -x
ls -l
ls "-l"
set +x
答え2
これはbashで引用が機能する方法ではありません。入力するとき
ls "-R"
引用符の削除はコマンドから発生するため、コマンドは次のようになります。
ls -R
一方、設定すると
text='ls "-R"'
実行すると、$text
見積もりの削除は発生しません。man bash
拡張セクションを参照してください。
前の拡張の後、以前の拡張のいずれかで発生しなかった引用符のない文字 \、 '、および ' はすべて削除されます。
"
パラメータ拡張の結果は次のようになり、削除されません。