菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
76
0

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

原创
05/13 14:22
阅读数 698

本篇文章介绍在 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" 字符串区分开。

即,当用 $ 获取变量值时,如果变量名后面跟着空白字符,隔开了其他内容,可以不用大括号来把变量名括起来。

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

发表评论

0/200
76 点赞
0 评论
收藏
为你推荐 换一批