Bash-用`set`恢复位置参数的意义是什么?

问题描述 投票:2回答:1

考虑以下代码以解析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个回答
0
投票

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

那时,脚本的其余部分将继续运行而没有这些参数。

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

[如果脚本随后将执行另一个命令(例如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 "$@"
© www.soinside.com 2019 - 2024. All rights reserved.