在bash脚本中,我调用另一个程序,但我想用命令行选项配置该程序。以下工作:
AREA_ARG=""
if __SOME_SETTING__ ; then
AREA_ARG=" --area us,ca "
fi
process_data -i /some/path $AREA_ARG也就是说,bash要么执行process_data -i /some/path,要么执行process_data -i /some/path --area us,ca。
然而,shellcheck抱怨!
$ shellcheck test.sh
In test.sh line 7:
process_data -i /some/path $AREA_ARG
^-------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
process_data -i /some/path "$AREA_ARG"
For more information:
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...我理解这个原理,但我希望/需要变量在空间上拆分,以便process_data获得2个参数。
在bash中,™做这件事的正确方式是什么?
发布于 2022-05-18 09:33:43
使用数组
下面是使用数组重新编写的代码。也可以作为一个工作示例(ls代替您的命令),并对变量使用正确的大小写(编码标准说大写名称保留给系统)。
#!/bin/bash
area_args=()
if true ; then
area_args=(-l -a)
fi
ls "${area_args[@]}"发布于 2022-05-18 19:20:29
对于特定的用例,有一个简单得多的答案:
unset -v area
if __SOME_SETTING__; then
area="ca,us"
fi
process_data -i /some/path ${area+ --area "$area" }如果由于某些原因不能使用数组,并且需要比上述实践提供的更多的控制,则可以考虑使用函数包装器。
withOptionalArea() {
if __SOME_SETTING__; then
"$@" --area us,ca
else
"$@"
fi
}
withOptionalArea process_data -i /some/path...but只有在特殊情况下才有必要这样做。
真的,使用数组。
发布于 2022-05-18 19:29:04
在变量中存储任意命令或参数的正确方法是使用数组,请参阅如何运行存储在变量中的命令?
但是,您可以告诉should检查您喜欢它的方式,只要您确信它是好的(也就是说,您没有应该保持不变的空白,或者没有可能导致问题的单词,并且没有将IFS更改为会破坏它的东西):
AREA_ARG=""
if __SOME_SETTING__ ; then
AREA_ARG=" --area us,ca "
fi
# shellcheck disable=SC2086 # split on purpose
process_data -i /some/path $AREA_ARGhttps://unix.stackexchange.com/questions/702993
复制相似问题