【问题标题】:Bash - what is the point of restoring positional arguments with `set`?Bash - 用`set`恢复位置参数有什么意义?
【发布时间】:2020-01-26 06:06:13
【问题描述】:

考虑下面的代码来解析 bash 脚本参数(比如说example.sh):

#!/bin/bash
positional=()
while [ $# -gt 0 ]
do
    arg="$1"
    case ${arg} in
        -h|--help|\?)       show_usage;         exit 0      ;;
        -v|--verbose)       verbose=1;          shift       ;;
        -f|--file)          theFile="$2";       shift; shift;;
        *)                  positional+=("$1"); shift       ;;
    esac
done
set -- "${positional[@]}"

arg1a="${positional[0]}"; arg1b="$1" # same result, $arg1a == $arg1b
arg2a="${positional[1]}"; arg2b="$2" # same result, $arg2a == $arg2b

通过以下脚本调用:

./example.sh pos1 -v -f toto.txt pos2

  • 在循环之前,"$1" == "pos1""$5" == "pos2"
  • 循环之后,set --$1$2$5 之前未定义
  • set --"$1" == "pos1""$2" == "pos2"之后

而且,在set --${positional[0]} == "pos1"${positional[1]} == "pos2"之后。

那么,问题是:使用set -- "${positional[@]}" 的实际意义是什么?

我们确实可以按照提供的顺序获取位置参数的值(使用${positional[i]}),而无需将其恢复为$1$2。因此,我不明白使用set -- 的意义。如果我们不在这里使用它,那么$# -eq 0 就是这样......

请提供一个现实生活中的示例,其中set -- 是强制使用的,即使使用此${positional[]} 数组也是如此。

【问题讨论】:

    标签: bash parameter-passing


    【解决方案1】:

    在“while”循环之后,“positional”数组将捕获除“-v”、“--verbose”、“-f”和“--file”之外的所有命令行选项和参数(以及 -f/--file 的参数)。

    此时,脚本的其余部分将在没有这些参数的情况下继续运行。

    这种编码的可能原因是上述代码块扩展了脚本的原始行为以包含两个附加选项(详细和文件),脚本的其他部分不支持这些选项。

    如果脚本将使用用户提供的命令行参数执行另一个不支持详细/文件选项的命令(例如 ls),这将很有用。

    # Code to strip verbose/file command line options
    while 
    do
        ...
    done
    set --
    # Do something above $verbose, $theFile
    ...
    # Original script here - use any unprocessed parameters from command line
    ls "$@"
    

    编辑:来自 cmets:

    使用现代 bash,您几乎可以在任何操作中使用数组而不是位置参数。少数例外:内置:shiftgetopt,仅适用于位置参数

    【讨论】:

    • 这里没有必要,因为您可以调用ls "${positional[@]}" 而不是ls "$@"。我正在寻找需要使用set -- 的示例
    • 借助现代 bash,您几乎可以对任何操作使用数组而不是位置参数。少数例外:内置:shift、getopt,仅适用于位置参数
    • 这正是我想要的。我真的没有看到在手动解析选项后必须使用getoptshift 的场景,但是这些内置确实需要使用set --。感谢您提供此信息。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多