Bash技巧:详解用$获取变量值是否要加双引号或者大括号

本篇文章介绍在 Linux bash shell 中,用 $ 获取变量值时,是否要加双引号、是否要加大括号。git

用 $ 获取变量值是否要加双引号

在 bash shell 脚本中,用 $ 来获取变量值时,有一些不加双引号,例如 $arg。有一些会加双引号,例如 "$arg"
下面具体说明这两种形式之间的区别,什么状况下要加双引号,什么状况能够不加双引号。shell

在 bash 中,各个参数之间默认用隔开。
当参数值自己就带有空格时,若是不加双引号把参数值括起来,那么这个参数值可能会被扩展为多个参数值,而丢失本来的完整值。
具体举例说明以下: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 变量的值保持不变,被当成一个参数。
使用双引号把字符串括起来,能够避免空格致使单词拆分。ui

即,当咱们须要保持变量自己值的完整,不想被空格扩展为多个参数,那么就须要用双引号括起来code

在给脚本或函数传递参数时,咱们可能不肯定获取到的参数值是否带有空格。
为了不带有空格致使不预期的单词拆分,形成参数个数发生变化,建议传参时每一个参数都使用双引号括起来。字符串

用 $ 获取变量值是否要加大括号

在 bash shell 脚本中,用 $ 来获取变量值时,有一些不加大括号,例如 $var。有一些会加大括号,例如 ${var}
下面具体说明这两种形式之间的区别,什么状况下要加大括号,什么状况能够不加大括号。it

查看 man bash 里面对 ${parameter} 表达式的含义说明以下:io

${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).

即,大括号 {} 的做用是限定大括号里面的字符串是一个总体,不会跟相邻的字符组合成其余含义。function

例如,有一个 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" 字符串区分开。

即,当用 $ 获取变量值时,若是变量名后面跟着空白字符,隔开了其余内容,能够不用大括号来把变量名括起来。

若是变量名后面直接跟着不属于变量名自身的其余字符,就须要用大括号把变量名括起来,以便明确该变量的名称

相关文章
相关标签/搜索