Bash-使用“set”恢复位置参数有什么意义?

Bash-使用“set”恢复位置参数有什么意义?,bash,parameter-passing,Bash,Parameter Passing,考虑以下代码来解析bash脚本参数(比如example.sh): 通过以下对脚本的调用: /example.sh pos1-v-f toto.txt pos2 在循环之前,“$1”==“pos1”和“$5”==“pos2” 循环之后,设置--之前,$1,$2和$5未定义 在设置--之后,“$1”==“pos1”和“$2”==“pos2” 而且,在设置--之后,${positional[0]}==“pos1”和${positional[1]}==“pos2” 所以,问题是:使用set--“${

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

通过以下对脚本的调用:

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

  • 在循环之前,
    “$1”==“pos1”
    “$5”==“pos2”
  • 循环之后,
    设置--
    之前,
    $1
    $2
    $5
    未定义
  • 设置--
    之后,
    “$1”==“pos1”
    “$2”==“pos2”
而且,在设置--之后,
${positional[0]}==“pos1”
${positional[1]}==“pos2”

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


请提供一个实际示例,其中必须使用
集--
,即使使用此
${positional[]}
数组。

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

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

这种编码的可能原因是,上面的块扩展了脚本的原始行为,以包括两个附加选项(verbose和file),脚本的其他部分不支持这两个选项

如果脚本将执行另一个命令(例如ls),而该命令不支持verbose/file选项,并且带有用户提供的命令行参数,则这可能非常有用

# 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 "$@"
编辑:来自评论:


使用现代bash,几乎可以对任何操作使用数组而不是位置参数。很少有例外情况:内置的:
shift
getopt
,只处理位置参数

,这在这里并不是必需的,因为您可以调用
ls“${positional[@]}”
,而不是
ls“$@”
。我正在寻找一个例子,其中使用
set--
是现代bash所必需的,对于几乎任何操作,您都可以使用数组而不是位置参数。很少有例外:内置的:shift,getopt,只在位置参数上工作这正是我想要的。我没有看到在手动解析选项后必须使用
getopt
shift
的场景,但这些内置选项确实需要使用
set--
。谢谢你提供的信息。
# 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 "$@"