如何正确使用包含多个参数(可能包含空格)的 bash 变量

Tot*_*chi 4 bash shell

如何将包含空格的变量传递给脚本以便脚本正确处理它们?

我的最小例子:

测试文件

#!/bin/bash
COUNTER=1
for i in "$@"; do echo "$COUNTER '$i'"; ((COUNTER++)); done
Run Code Online (Sandbox Code Playgroud)

如果我直接使用一些参数(转义空间)调用脚本,它会起作用:

./test.sh 1 2 3\ 4 5
Run Code Online (Sandbox Code Playgroud)

输出(如预期):

1 '1'
2 '2'
3 '3 4'
4 '5'
Run Code Online (Sandbox Code Playgroud)

如果我将参数存储到变量中,反斜杠将不再被正确解释为转义字符。

TEST_ARGS="1 2 3\ 4 5"
./test.sh $TEST_ARGS
Run Code Online (Sandbox Code Playgroud)

输出:

1 '1'
2 '2'
3 '3\'
4 '4'
5 '5'
Run Code Online (Sandbox Code Playgroud)

我想得到像以前一样的输出。我怎样才能达到它?

TEST_ARGS="1 2 3\ 4 5"
# how to call ./test.sh here?
Run Code Online (Sandbox Code Playgroud)

我更详细的用例是,我有一些脚本,它为我的其他工具/脚本准备所有标志。

prepare_flags.sh(非常简约):

#!/bin/bash
echo 'TEST_ARGS="1 2 3\ 4 5"'
Run Code Online (Sandbox Code Playgroud)

在我的实际脚本中,我获取了prepare_flags.sh脚本的输出以访问TEST_ARGS:

source <( ./prepare_flags.sh )
./test.sh $TEST_ARGS # this fails
bash -c "./test.sh $TEST_ARGS" # this works
Run Code Online (Sandbox Code Playgroud)

除了 bash -c 之外还有其他解决方案吗?

And*_*mek 7

使用数组,而不是普通变量。

(此外,没有理由使用像exprBash 这样古老的外部工具;((++COUNTER))也可以很好地工作。(此外,最好避免大写变量名称,因为这些(按照惯例)用于环境变量。))

test.sh:

for ((i = 1; i <= $#; ++i)); do echo "${i} '${!i}'"; done
Run Code Online (Sandbox Code Playgroud)

传递参数:

test_args=(1 2 '3 4' 5)
./test.sh "${test_args[@]}"
Run Code Online (Sandbox Code Playgroud)