![2c975a6f19e55fe46e9bedf0884b662f.png](https://i-blog.csdnimg.cn/blog_migrate/cf7dbed7c64b7f2731fd086214c245a4.jpeg)
本篇文章介绍在 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$#: 4first: Thissecond: is$ test_args "$args"$#: 1first: This is a Testsecond:
这里定义了一个 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 HelloSay Hello$ echo $varHello$ echo ${var}HelloSayHello$ echo "$var"HelloSayHello
可以看到,$var Hello 这种写法打印出来的 "Say" 和 "Hello" 中间有空格,不是想要的结果。
而 $varHello 打印为空,这其实是获取 varHello 变量的值,这个变量没有定义过,默认值是空。${var}Hello 打印出了想要的结果,用 {} 把 var 括起来,明确指定要获取的变量名是 var,避免混淆。"$var"Hello 用双引号把 $var 括起来,也可以跟后面的 "Hello" 字符串区分开。
即,当用 $ 获取变量值时,如果变量名后面跟着空白字符,隔开了其他内容,可以不用大括号来把变量名括起来。
如果变量名后面直接跟着不属于变量名自身的其他字符,就需要用大括号把变量名括起来,以便明确该变量的名称。