我有一个脚本需要将其所有参数转发到不同的程序。此外,出于清洁目的,我保留了 shell 选项 nounset
启用。
考虑以下示例脚本:
#!/bin/ksh
set -o nounset
# Pass all of our parameters (plus a few extra) to our target
printf "<%s>\n" "Parameter count: $#" "$@"
只要主调用脚本至少有一个参数,上述方法就可以正常工作。如果它没有参数,则结果为
ksh: @: parameter not set
并且脚本终止。$ ./dollar_at.sh "Hello" "World"
<Parameter count: 2>
<Hello>
<World>
$ ./dollar_at.sh ""
<Parameter count: 1>
<>
$ ./dollar_at.sh
./dollar_at.sh[5]: @: parameter not set
如果我禁用
nounset
选项,我们得到以下内容:$ ./dollar_at.sh
<Parameter count: 0>
顺便说一句,
nounset
下 bash
处理空 $@
没有错误,但是这个脚本的环境没有 bash
作为一种选择。有没有办法让
ksh
用空玩好 $@
? 理想情况下,我想要
"$@"
扩展为零参数,就像 bash
确实和 ksh
没有 nounset
启用。到目前为止,我只提出了两种可能的解决方法,我对这两种方法都不满意:
if (( $# > 0 ))
中并有条件地通过 $@
.我不喜欢这个选项,因为必须始终传递其他常量参数,这会导致代码重复。 nounset
任何时候我需要访问的选项 $@
.这感觉像是不好的做法并且违背了拥有 nounset
的目的。启用开始。 最佳答案
当您保留 set -o nounset
,将特殊处理保留在 1 个地方:一个函数。
function forwarder {
target=$1
shift
if [ $# -eq 0 ]; then
"${target}"
else
"${target}" "$@"
fi
}
set -u
forwarder ./dollar_at.sh hello world
forwarder ./dollar_at.sh hello
forwarder ./dollar_at.sh ""
forwarder ./dollar_at.sh
关于shell - 在 ksh 中混合 "nounset"和 "$@",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35135463/