如何将包含空格的变量传递给脚本以便脚本正确处理它们?
我的最小例子:
测试文件
#!/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 之外还有其他解决方案吗?
使用数组,而不是普通变量。
(此外,没有理由使用像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)