我想使用“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
如何正确地将这个表达式传递给设置命令?
答案1
您应该始终引用变量以防止奇怪的行为。所以使用set -- "Q"
in 而不是仅仅使用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
答案3
您已经被告知如何解决问题(我认为数组方法更好)。还缺少的是一个解释。
引用 ( "
, '
, \
) 仅适用于命令行(即,如果 shell 解析器逐字地遇到它们)。如果它是变量的一部分,那么它只是一个字符串。只有通配字符和分词字符在变量中相关。
例外情况是您通常eval
在“命令行级别”获取变量的内容。但这很少是一个好主意。
Q='A "*" B'
echo $Q
A "*" B
eval echo $Q
A * B
另一种选择是禁用通配符:
Q='A * B'
set -f
echo $Q
A * B