在 bash 中设置位置参数的方法

在 bash 中设置位置参数的方法

https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

...

--如果此选项后面没有参数,则位置参数将被取消设置。否则,位置参数将设置为参数,即使其中一些参数以“-”开头。

-发出选项结束信号,导致所有剩余参数分配给位置参数。 -x 和 -v 选项已关闭。如果没有参数,位置参数保持不变。

使用“+”而不是“-”会导致这些选项被关闭。这些选项也可以在调用 shell 时使用。当前的选项集可以在 $- 中找到。

其余 N 个参数是位置参数,并按顺序分配给 $1、$2、... $N。特殊参数#设置为N。

设置位置参数好像有3种方法:

set -- argument
set - argument
set argument

他们有什么区别?

谢谢。

答案1

--和之间的区别-在于,当-使用时,-x-v选项也未设置。

$ set -vx
$ echo "$-"
himvxBHs                # The options -v and -x are set.

$ set - a b c
$ echo "$-  <>  $@"     # The -x and -v options are turned off.
himBHs  <>  a b c

这是 shell 接受 的常用方式-,但是,在 POSIX 中,此选项是“未指定的”:

如果第一个参数为“-”,则结果未指定。

set --和 plain之间的区别set非常常用。
手册中解释得很清楚:

-- 如果此选项后面没有参数,则未设置位置参数。否则,位置参数将设置为 args,即使其中一些参数以 - 开头。

-- 表示“选项结束”,后面的任何参数即使以 - 开头也将用作位置参数。

$ set -- -a -b -e -f arg1
$ echo "$@"
-a -b -e -f arg1

反而:

$ set -a -b -e -f arg1
$ echo "$@"
arg1

但一些 shell 选项也发生了变化。

不使用任何 - 或 -- 将允许使用扩展为选项名称的变量设置设置选项(即使引用):

$ echo "$-"
himBHs

$ a='-f'
$ set "$a"

$ echo "$-"
fhimBHs

答案2

set argument和之间的区别set -- argument对于许多其他命令来说是常见的。

有时您有一个以 开头的参数-,但您实际上无法使用它,因为该命令认为(因为它以 开头-)它实际上是一个命令选项。

其内容--实际上是:“够了!接下来的一切,即使它以 开头-,都是一个实际的论点”。

通常(根据手册页)lone-相当于--此目的。

例子

您可能会使用:

set -- -a -b file1 file2  

分别设置$1$2$3$4-a-bfile1file2。不--存储 - 它只是一个指示器;如果没有它,-aand-b将被解释为set命令本身的可能选项。

相关内容