setコマンドに特別なワイルドカード文字を渡す

setコマンドに特別なワイルドカード文字を渡す

「set」コマンドを使用して特殊記号「*」に変数を設定したいと思います。

$ Q='A * B'
$ set -- $Q
$ echo "$1 $2 $3"

私は「A*B」を期待した

もちろん、アスタリスクは特別なシンボルなので、期待どおりに機能しません。

私は試した:

$ Q='A \* B'
$ Q='A "*" B'

しかし、次に渡されます。$2

期待していたA \* Bよりもそんなことを得たA "*" BA * B

この式をsetコマンドに正しく渡すには?

答え1

奇妙な動作を防ぐには、常に変数を引用する必要があります。したがって、set -- "Q"ただset -- $Q

$ Q='A * B'
$ set -- "$Q"
$ echo "$1 $2 $3"
A * B

答え2

Qを3つの別々の単語にするには、配列を使用する必要があります。

Q=(A '*' B)
set -- "${Q[@]}"    # you must use this syntax to expand the array safely.
printf '%s\n' "$@"  # print the positional params on separate lines
A
*
B

バラよりhttp://mywiki.wooledge.org/BashFAQ/050詳細については。

答え3

問題を解決する方法を聞きました(私の考えでは、配列アプローチがより良いと思います)。抜けたのは説明です。

引用符("、、、'\はコマンドラインにのみ適用されます(つまり、シェルパーサーが文字通りそれを検出した場合)。変数の一部である場合、これは文字列にすぎません。変数にはワイルドカード文字とトークン化文字のみが関連します。

例外は通常、eval「コマンドラインレベル」から変数の内容を取得することです。しかし、これが良い考えである場合はほとんどありません。

Q='A "*" B'

echo $Q
A "*" B

eval echo $Q
A * B

別のオプションはワイルドカードを無効にすることです。

Q='A * B'

set -f

echo $Q
A * B

関連情報