
「set」コマンドを使用して特殊記号「*」に変数を設定したいと思います。
$ Q='A * B'
$ set -- $Q
$ echo "$1 $2 $3"
私は「A*B」を期待した
もちろん、アスタリスクは特別なシンボルなので、期待どおりに機能しません。
私は試した:
$ Q='A \* B'
$ Q='A "*" B'
しかし、次に渡されます。$2
期待していたA \* B
よりもそんなことを得たA "*" B
A * 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