使用 - 和 - 作为设置位置参数时设置的选项之间的区别

时间:2011-07-01 05:55:25

标签: linux bash shell

在man bash中,提到set有两个选项---

我想知道在设置位置参数时使用---作为set选项时是否存在任何差异。

当谈到他们在设置位置参数时的使用时,我找不到man bash中提到的任何重大差异。

4 个答案:

答案 0 :(得分:8)

使用--(双减号)表示shell选项的结束和参数的开始。因此,例如:

set -- -a -b -f somefile

在此之后,$1-a$2-b$3-f$4为{{ 1}}。

如果没有somefile,shell会将---a-b解释为shell选项,并将-f设置为$1

Bash(4.1)手册说(somefile):

  

set如果此选项后面没有参数,那么位置参数   没有设定。否则,位置参数设置为参数,   即使其中一些以“--”开头。

     

-表示选项的结束,导致所有剩余的参数   分配给位置参数。 “-”和“-x”选项   被关掉了。如果没有参数,则为位置参数   保持不变。

答案 1 :(得分:2)

约定是对单个字母的参数使用单个-,例如-i {和} --为他们的措辞完整的对手,例如--interactive

有关详细信息,请参阅here

StackExchange网络上已经很好地回答了elsewhere

<强>更新

双击--前缀为命令的长(逐字)选项,但当与Bash内置(如set)一起使用时,它表示该特定命令的选项结束。

E.g。如果要创建以短划线开头的文件:

touch -dashed

...你会收到错误:

touch: illegal option -- h
usage: touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...

然而,请尝试使用--,等等瞧:

touch -- -dashed

...然后ls查看当前目录中的-dashed

有关详细信息,请参阅here

答案 2 :(得分:2)

4.1.5(1)的bash(1)手册页说:

--      If no arguments follow this option, then the  positional
        parameters are unset.  Otherwise, the positional parame‐
        ters are set to the args, even if  some  of  them  begin
        with a -.
-       Signal  the  end of options, cause all remaining args to
        be assigned to the positional parameters.  The -x and -v
        options are turned off.  If there are no args, the posi‐
        tional parameters remain unchanged.

第一个区别是---之后没有参数。对于前者,现有的位置参数将保持不变。对于后者,位置参数将被清除。

所以set --清除位置参数,set -是无操作。

-v-x设置可能会被set - ...修改。因此,如果您打开了set -v(这会导致shell在读取时打印输入行),它将被set - ...命令关闭。 set -- ...会保持不变。

set -x更为常见,set -vset -x经常用于调试脚本以查看正在运行的命令。通常在调试shell脚本时,您可以使用bash -x <script>运行它。知道set - ...关闭了-x,您可能想要使用set -- ...,因为将-x作为另一个命令的副作用关闭会非常意外

答案 3 :(得分:1)

在我的bash联机帮助页中,有一句话:An argument of - is equivalent to --