为什么 POSIX shell 脚本中的这些嵌套选项会被分词?

为什么 POSIX shell 脚本中的这些嵌套选项会被分词?

count_args我有一个计算参数的脚本:

#!/bin/sh
echo $#

如果我使用这些选项调用它,它会告诉我它有两个参数:

$ ./count_args --options '1 2'
2

但是如果我在脚本中构造参数,test_args如下所示:

#!/bin/sh
ARGS="--options '1 2'"
./count_args ${ARGS}

...我得到结果:

$ ./test_args 
3

'1 2'剧本中为何要分裂?我怎样才能以符合 POSIX 标准的方式避免这种情况,从调用脚本?是否仍然可以以某种方式将参数存储在变量中,以便我可以在更复杂的脚本中将它们分开(例如具有ARGS_1ARGS_2)?

请注意,我的/bin/shdash.

答案1

在第一种情况下,传递给的参数count_args由 shell 解释,shell 看到两个单词--options1 2然后将它们传递给count_args.

对于第二种情况,在双引号内,除$和之外的所有字符\都被视为文字。 shell 解释单引号为时已晚,shell 将$ARGS变量的内容视为长字符串--options '1 2',所有字符均视为文字,对 shell 没有特殊含义。

使用${ARGS}不带双引号的情况会导致字段分割和文件名扩展。使用默认值IFS,您会得到三个独立的单词:--options'12'

存档的最佳方法是使用"$@"

#!/bin/sh

set -- --options '1 2'

./count_args "$@"

相关内容