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_1
和ARGS_2
)?
请注意,我的/bin/sh
是dash
.
答案1
在第一种情况下,传递给的参数count_args
由 shell 解释,shell 看到两个单词--options
,1 2
然后将它们传递给count_args
.
对于第二种情况,在双引号内,除$
和之外的所有字符\
都被视为文字。 shell 解释单引号为时已晚,shell 将$ARGS
变量的内容视为长字符串--options '1 2'
,所有字符均视为文字,对 shell 没有特殊含义。
使用${ARGS}
不带双引号的情况会导致字段分割和文件名扩展。使用默认值IFS
,您会得到三个独立的单词:--options
、'1
和2'
。
存档的最佳方法是使用"$@"
:
#!/bin/sh
set -- --options '1 2'
./count_args "$@"