为什么位置参数语法 `${18}` 需要大括号?

为什么位置参数语法 `${18}` 需要大括号?

我目前正在学习命令行,并且正在学习位置参数。我看到位置参数以 9 结尾,要使用超过 $9,我必须将它们放在大括号中,例如:${18}。但是九个位置参数的故事是什么,并且不允许将更多的参数设置为形状:$18?

答案1

位置参数列表的长度可以根据需要且在当前资源限制允许的情况下进行。这意味着列表中可能有超过 9 个元素。正如您已经注意到的,可以通过在数字周围添加大括号来访问元素 10 及更高版本,如 中所示${12}

在大多数类似 POSIX 的 shell 中,需要使用大括号来访问元素 9 之外的元素,因为 POSIX 标准是这么规定的。

位置参数是由一位或多位数字(除了单个数字 0)表示的十进制值表示的参数。表示位置参数的数字应始终被解释为十进制值,即使有前导零。当指定的位置参数多于一位数字时,应用程序应将数字括在大括号中。

从这里,“Shell 命令语言:位置参数”)

上面文本中的“应用程序”一词的意思是“您的脚本”。

参数扩展的最简单形式是:

${parameter}

的值(如果有)parameter应被替换。

参数名称或符号可以用大括号括起来,大括号是可选的一位以上的位置参数除外或者当参数是名称且后跟可以解释为名称一部分的字符时。

从这里、《Shell 命令语言:参数扩展》)

另请注意,寻址除前几个位置参数之外的任何其他参数直接地这是一件非常罕见的事情。访问$1和很常见$2,但$3和 的其他用途很少。更常见的是迭代列表,如下所示

for argument do
    # use "$argument" here
done

...或者一次性使用整个列表"$@"

另请注意,某些 shell 可能会选择忽略该标准。这是zshshell,它并不尝试严格遵守 POSIX:

$ set -- a b c d e f g h i j k l m n o p
$ print $13
m
$ print $16
p

...除非它正在模仿sh

$ emulate sh
$ print $13
a3

a3字符串来自输出,$1后跟3.

相关内容