何时引用参数扩展并将参数名称括在大括号中?

Tim*_*Tim 1 bash

在参数扩展中:

  • 双引号参数扩展总是比没有更好(或不更糟)吗?是否存在不建议使用双引号的情况?

  • 什么时候需要在参数名称周围添加大括号?

  • 我们什么时候应该在参数扩展周围使用双引号而不是参数名称周围的大括号?什么时候反过来?两者中的任何一个何时起作用?

谢谢。

ImH*_*ere 5

引用

当您想要保持扩展值被拆分为多个单词并不受 IFS 值影响时,引用参数扩展总是更好。例如:

$ IFS=" elr"
$ var="Hello World"
$ printf '<%s> ' $var; echo
<H> <> <> <o> <Wo> <> <d>

$ printf '<%s> ' "$var"; echo
<Hello World>
Run Code Online (Sandbox Code Playgroud)

但是,有一些非常有限的实例需要不加引号的扩展才能真正完成拆分:

$ IFS=$' \t\n'
$ var="one two three"
$ array=($var)
$ declare -p array
declare -a array=([0]="one" [1]="two" [2]="three")
Run Code Online (Sandbox Code Playgroud)

关于该主题的链接:
何时需要双引号?
吉尔斯·
斯蒂芬·查泽拉斯


大括号

当变量名后面的字符不应该与这样的变量名连接时,总是需要大括号:

$ var=one
$ echo "The value of var is $varvalue"
The value of var is
$ echo "The value of var is ${var}value"
The value of var is onevalue
Run Code Online (Sandbox Code Playgroud)

LESS="+/which is not to be interpreted as part" man bash

${parameter}
大括号是必需的……当参数后跟一个不作为其名称一部分的字符时。

此外; 处理任何两位数的位置参数时都需要大括号。

$ set -- one two t33 f44 f55 s66 s77 e88 n99 t10 e11 t12
$ echo "$11 ${11} $12 ${12}"
one1 e11 one2 t12
Run Code Online (Sandbox Code Playgroud)

阅读手册: LESS="+/enclosed in braces" man bash

当扩展包含多个数字的位置参数时,必须将其括在大括号中

或者 LESS="+/with more than one digit" man bash

${parameter} 参数
的值被替换。当参数是一个多于一位的位置参数时需要大括号,...

引号与大括号

我们什么时候应该在参数扩展周围使用双引号而不是参数名称周围的大括号?什么时候反过来?两者中的任何一个何时起作用?

没有关于“应”仅使用以下任一方法的开放可能性的规则:

$ var=One
$ echo "ThisIs${var}Var"
ThisIsOneVar

$ echo "ThisIs""$var""Var"
ThisIsOneVar

$ echo 'ThisIs'"$var"'Var'
ThisIsOneVar

$ echo 'ThisIs'"${var}"'Var'
ThisIsOneVar
Run Code Online (Sandbox Code Playgroud)

所有扩展都是完全等效的,使用您更喜欢的任何扩展。


归档时间:

查看次数:

1899 次

最近记录:

7 年,7 月 前