我的 bash 脚本中遇到一些奇怪的行为。
我有一个简单的脚本parser.sh
,非常简单:
#!/bin/bash
for arg in "$@"
do
echo ARGUMENT: "$arg"
done
该脚本是从同一目录中的另一个脚本调用的,我们称之为这个脚本test.sh
#!/bin/bash
`pwd`/parser.sh "ARG1=FIRST" "ARG2=TESTING SPACES"
上面显示的脚本确实有效,并按预期输出参数:
ARGUMENT: ARG1=FIRST
ARGUMENT: ARG2=TESTING SPACES
但是,如果我更改test.sh
如下:
#!/bin/bash
ARGS="\"ARG1=FIRST\" \"ARG2=TESTING SPACES\""
`pwd`/parser.sh $ARGS
这个简单的修改使代码在迭代参数时失败:
ARGUMENT: "ARG1=FIRST"
ARGUMENT: "ARG2=TESTING
ARGUMENT: SPACES"
为什么会发生这种情况?我缺少什么?
提前致谢
答案1
不要将参数保存在常规变量中,请使用数组:
args=( "ARG1=FIRST" "ARG2=TESTING SPACES" )
./parser.sh "${args[@]}"
您的引号将按字面意思处理,因为它们已被转义,并且您的变量正在不带引号的情况下扩展,因此它会受到分词的影响。
另外不需要pwd
这样使用,.
可以用来引用当前目录。
您可以通过以下方式查看如何处理您的变量:
$ ARGS="\"ARG1=FIRST\" \"ARG2=TESTING SPACES\""
$ printf '%q\n' $ARGS
\"ARG1=FIRST\"
\"ARG2=TESTING
SPACES\"
正如您所看到的,双引号正在扩展转义,这不是您的意图,并且TESTING
和之间的空格SPACES
不是逃脱了。