Bash 函数在变量中定义时不解析参数

Bash 函数在变量中定义时不解析参数

我的 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 不是逃脱了。

相关内容