gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:36:33 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com