引用

引用

在参数展开中:

  • 双引号参数扩展总是比不双引号更好(还是更差)?是否存在不建议使用双引号的情况?

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

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

谢谢。

答案1

引用

当您想保留扩展值时,引用参数扩展总是更好不是分成几个字并受 IFS 值的影响。例如:

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

$ printf '<%s> ' "$var"; echo
<Hello World>

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

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

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


牙套

当变量名称后面的字符不应与此类变量名称连接时,始终需要大括号:

$ 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

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

阅读手册: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

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

答案2

需要大括号的一种情况是当您要将变量用作字符串的一部分时:

$ var=test
$ echo "stuff$varmorestuff"
stuff
$ echo "stuff${var}morestuff"
stufftestmorestuff

如果没有大括号,shell 会认为我正在尝试扩展一个名为varmorestuffwhich 的未设置变量。

来自 bash 参考手册3.5.3 Shell参数扩展:

'$' 字符引入参数扩展、命令替换或算术扩展。要扩展的参数名称或符号可以用大括号括起来,大括号是可选的,但用于保护要扩展的变量免受紧随其后的字符的影响,这些字符可能被解释为名称的一部分。

来自外壳手册2.6.2 参数扩展

如果参数名称或符号未括在大括号中,则扩展应使用最长的有效名称(请参阅 IEEE Std 1003.1-2001 的基本定义卷,第 3.230 节,名称),无论该名称表示的符号是否存在。


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

脚本文件

#!/bin/sh
if [ "$1" = 'correct' ]; then
        echo "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
else
        echo "$2" "$3" "$4" "$5" "$6" "$7" "$9" "$9" "$10"
fi

行动中:

$ ./script.sh one two three four five six seven eight nine ten
two three four five six seven nine nine one0
$ ./script.sh correct two three four five six seven eight nine ten
two three four five six seven eight nine ten

来自 bash 手册3.4.1 位置参数

位置参数 N 可以引用为 ${N},或者当 N 由单个数字组成时引用为 $N。

摘自shell手册2.6.2参数扩展

参数名称或符号可以用大括号括起来,除了具有多于一位数字的位置参数或参数后跟可解释为名称一部分的字符时,大括号是可选的。匹配的右大括号应通过计算大括号级别、跳过带引号的字符串和命令替换来确定。

相关内容