将特殊通配符传递给 set 命令

将特殊通配符传递给 set 命令

我想使用“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

http://mywiki.wooledge.org/BashFAQ/050更多细节。

答案3

您已经被告知如何解决问题(我认为数组方法更好)。还缺少的是一个解释。

引用 ( ", ', \) 仅适用于命令行(即,如果 shell 解析器逐字地遇到它们)。如果它是变量的一部分,那么它只是一个字符串。只有通配字符和分词字符在变量中相关。

例外情况是您通常eval在“命令行级别”获取变量的内容。但这很少是一个好主意。

Q='A "*" B'

echo $Q
A "*" B

eval echo $Q
A * B

另一种选择是禁用通配符:

Q='A * B'

set -f

echo $Q
A * B

相关内容