本篇文章介绍在 Linux bash shell 中,用 $
获取变量值时,是否要加双引号、是否要加大括号。
用 $ 获取变量值是否要加双引号
在 bash shell 脚本中,用 $
来获取变量值时,有一些不加双引号,例如 $arg
。有一些会加双引号,例如 "$arg"
。
下面具体说明这两种形式之间的区别,什么情况下要加双引号,什么情况可以不加双引号。
在 bash 中,各个参数之间默认用隔开。
当参数值本身就带有空格时,如果不加双引号把参数值括起来,那么这个参数值可能会被扩展为多个参数值,而丢失原本的完整值。
具体举例说明如下:
$ function test_args() { echo \$\#: $#; echo first: $1; echo second: $2; }
$ args="This is a Test"
$ test_args $args
$#: 4
first: This
second: is
$ test_args "$args"
$#: 1
first: This is a Test
second:
这里定义了一个 test_args 函数,打印传入的 $1
、$2
参数值。
所给的 args 变量指定的字符串含有空格。
可以看到,当执行 test_args $args
时,args 变量的值被空格隔开成四个参数。
而执行 test_args "$args"
时,args 变量的值保持不变,被当成一个参数。
使用双引号把字符串括起来,可以避免空格导致单词拆分。
即,当我们需要保持变量本身值的完整,不想被空格扩展为多个参数,那么就需要用双引号括起来。
在给脚本或函数传递参数时,我们可能不确定获取到的参数值是否带有空格。
为了避免带有空格导致不预期的单词拆分,造成参数个数发生变化,建议传参时每个参数都使用双引号括起来。
用 $ 获取变量值是否要加大括号
在 bash shell 脚本中,用 $
来获取变量值时,有一些不加大括号,例如 $var
。有一些会加大括号,例如 ${var}
。
下面具体说明这两种形式之间的区别,什么情况下要加大括号,什么情况可以不加大括号。
查看 man bash 里面对 ${parameter}
表达式的含义说明如下:
${parameter}
The value of parameter is substituted.
The braces are required when parameter is a positional parameter with more than one digit, or when parameter is followed by a character which is not to be interpreted as part of its name.
The parameter is a shell parameter or an array reference (Arrays).
即,大括号 {}
的作用是限定大括号里面的字符串是一个整体,不会跟相邻的字符组合成其他含义。
例如,有一个 var 变量值是 "Say",现在想打印这个变量值,并跟着打印 "Hello" 字符串,也就是打印出来 "SayHello" 字符串。
那么获取 var 变量值的语句和 "Hello" 字符串中间就不能有空格,否则 echo 命令会把这个空格一起打印出来。
但是写为 $varHello
达不到想要的效果。
具体举例如下:
$ var="Say"
$ echo $var Hello
Say Hello
$ echo $varHello
$ echo ${var}Hello
SayHello
$ echo "$var"Hello
SayHello
可以看到,$var Hello
这种写法打印出来的 "Say" 和 "Hello" 中间有空格,不是想要的结果。
而 $varHello
打印为空,这其实是获取 varHello 变量的值,这个变量没有定义过,默认值是空。 ${var}Hello
打印出了想要的结果,用 {}
把 var 括起来,明确指定要获取的变量名是 var,避免混淆。 "$var"Hello
用双引号把 $var
括起来,也可以跟后面的 "Hello" 字符串区分开。
即,当用 $
获取变量值时,如果变量名后面跟着空白字符,隔开了其他内容,可以不用大括号来把变量名括起来。
如果变量名后面直接跟着不属于变量名自身的其他字符,就需要用大括号把变量名括起来,以便明确该变量的名称。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。