Ama*_*rus 6 bash shell-script shellcheck
在 bash 脚本中,我调用另一个程序,但我想使用命令行选项配置该程序。以下作品:
\nAREA_ARG=""\nif __SOME_SETTING__ ; then\n AREA_ARG=" --area us,ca "\nfi\n\nprocess_data -i /some/path $AREA_ARG\n
Run Code Online (Sandbox Code Playgroud)\n即 bash 执行process_data -i /some/path
, 或process_data -i /some/path --area us,ca
。
然而shellcheck
抱怨!
$ shellcheck test.sh \n\nIn test.sh line 7:\nprocess_data -i /some/path $AREA_ARG\n ^-------^ SC2086: Double quote to prevent globbing and word splitting.\n\nDid you mean: \nprocess_data -i /some/path "$AREA_ARG"\n\nFor more information:\n https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...\n
Run Code Online (Sandbox Code Playgroud)\n我理解原理,但我希望/需要变量在空间上分割,以便process_data
获得 2 个参数。
在 中执行此操作的正确方法是什么bash
?
ctr*_*lor 14
使用数组
这是使用数组重写的代码。也是一个工作示例(ls
代替您的命令),并使用正确的变量大小写(编码标准规定大写名称是为系统保留的)。
#!/bin/bash
area_args=()
if true ; then
area_args=(-l -a)
fi
ls "${area_args[@]}"
Run Code Online (Sandbox Code Playgroud)
对于您的具体用例,有一个更简单的答案:
unset -v area
if __SOME_SETTING__; then
area="ca,us"
fi
process_data -i /some/path ${area+ --area "$area" }
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您无法使用数组,并且您需要比上述实践提供的更多控制,您可以考虑使用函数包装器。
withOptionalArea() {
if __SOME_SETTING__; then
"$@" --area us,ca
else
"$@"
fi
}
withOptionalArea process_data -i /some/path
Run Code Online (Sandbox Code Playgroud)
...但这应该只在特殊情况下才有必要。
确实,使用数组。