Bash-使用“set”恢复位置参数有什么意义?
考虑以下代码来解析bash脚本参数(比如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--“${
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 "$@"