0

我将所有参数连接到一个变量 $ARGS 中,并将它们全部传递给一个命令,就像./test_arg.sh所做的一样。

但是我发现带引号的字符串的参数被分成了多个。

这是我的测试脚本,test_arg.sh执行测试用例,而arg.sh只是在单独的行上打印每个参数。

$ cat ./test_arg.sh 
#!/bin/sh

ARGS="$ARGS OPT_1"
ARGS="$ARGS OPT_2"
ARGS="$ARGS 'OPT_3 is a string with space'"

echo "./arg.sh $ARGS"

echo '----------------------------'

./arg.sh $ARGS
[ xiafei@xiafeitekiMacBook-Pro ~/tmp ]
$ cat ./arg.sh 
#!/bin/sh

for var in "$@"
do
    echo "arg -> $var"
done

结果如下:

$ ./test_arg.sh
./arg.sh  OPT_1 OPT_2 'OPT_3 is a string with space'
----------------------------
arg -> OPT_1
arg -> OPT_2
arg -> 'OPT_3
arg -> is
arg -> a
arg -> string
arg -> with
arg -> space'

但是,如果我将参数直接放在命令之后,它可以正常工作:

$ cat test_arg.sh 
#!/bin/sh
./arg.sh OPT_1 OPT_2 'OPT_3 is a string with space'

[ xiafei@xiafeitekiMacBook-Pro ~/tmp ]
$ sh test_arg.sh 
arg -> OPT_1
arg -> OPT_2
arg -> OPT_3 is a string with space

我想问题是 bash 进程引用的方式。有人知道吗?

4

1 回答 1

0

unix shell 的工作方式,您的调用./arg.sh $ARGS不会评估 ' 引号。

一种可能的解决方案是使用eval "./arg.sh $ARGS".

于 2013-10-14T06:47:01.530 回答