从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
、-b
、file1
和file2
。不--
存储 - 它只是一个指示器;如果没有它,-a
and-b
将被解释为set
命令本身的可能选项。