我有一个古老的 bash 脚本,我想改进它。该脚本使用了许多变量,在某些情况下,某些变量被引用但为空或未设置。在这里这通常不是问题,因为脚本从一开始就是这样设计的。
然而,我已经开始使用shellcheck,它经常抱怨缺少引号。因此,我添加了引号,但遇到了一些不便,对此我没有很好的解决方案。
有很多行看起来像这样:
cmd $param1 $param2 $param3 $param4
如果其中一个参数为空或未设置,它仍然有效,并且 cmd 获取的参数数量会减少。但如果我开始添加引号
cmd "$param1" "$param2" "$param3" "$param4"
cmd 总是会得到 4 个参数,无论其中是否有一个为空。
为什么会这样,这是非常清楚的。解决方法也很明确(在使用参数之前检查是否为空),但它很丑陋并且需要大量额外的代码。
所以我正在寻找聪明的解决方案,要么a)省略参数(包括引号!)如果它是空的b)仅添加非空变量的引用
您使用什么 shell 来执行此脚本?我认为它是/bin/sh
POSIX shell 中唯一类似数组的实体是位置参数。你可以这样做:
set -- # clear the positional parameters
for param in "$param1" "$param2" "$param3" "$param4"; do
if [ -n "$param" ]; then
# append this param to the positional params
set -- "$@" "$param"
fi
done
# invoke the command with the positional params, properly quoted
cmd "$@"
Run Code Online (Sandbox Code Playgroud)
如果你想变得更聪明,请将 cmd 的调用包装在一个函数中:
invoke_cmd() {
n="$#" # remember the original number of params
# append to the args list only if non-empty
for arg; do [ -n "$arg" ] && set -- "$@" "$arg"; done
# discard the original params (including the empty ones)
shift "$n"
# and invoke the cmd
cmd "$@"
}
invoke_cmd "$param1" "$param2" "$param3" "$param4"
Run Code Online (Sandbox Code Playgroud)
对于实际的 bash,简化
invoke_cmd() {
local args=()
for arg; do [[ "$arg" ]] && args+=("$arg"); done
cmd "${args[@]}"
}
invoke_cmd "$param1" "$param2" "$param3" "$param4"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15426 次 |
最近记录: |