Bashスクリプトが機能しない

Bashスクリプトが機能しない

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拡張セクションを参照してください。

前の拡張の後、以前の拡張のいずれかで発生しなかった引用符のない文字 \、 '、および ' はすべて削除されます。

"パラメータ拡張の結果は次のようになり、削除されません。

関連情報