shell - 在 ksh 中混合 "nounset"和 "$@"

标签 shell ksh

我有一个脚本需要将其所有参数转发到不同的程序。此外,出于清洁目的,我保留了 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>

顺便说一句,nounsetbash处理空 $@没有错误,但是这个脚本的环境没有 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/

    相关文章:

    bash - 按上次编辑日期列出文件

    linux - shell bash 脚本 - 上传一个大的 tar 文件,重试?

    linux - xargs sh -c 跳过第一个参数

    linux - 如何从 LINUX 脚本向网站发送输入

    filesystems - 使用输出重定向时何时创建文件?

    shell - 是否有适用于 Windows 的 KornShell (ksh) IDE?

    git - SSH-ksh : git: not found

    Bash Scripting FFMPEG 如何等待进程完成

    linux - shell "${i%,v}"在 run-parts.sh 中是什么意思?

    bash - 如何一次退出多个嵌套的shell?