最近在工作用到shell脚本,用到了字符串变量的拼接,同时需要对字符串进行赋值,这里与大家分享一下,
1.字符串拼接
shell脚本里面可以对字符串进行拼接,并且可以将拼接后的值赋予给另外一个变量,下图给出了几种字符串拼接的样例,供大家参考。
#!/bin/bash a="123" # 定义a变量为"123" b="456" # 定义b变量为"456" first=$a$b # 第一种方式来拼接字符串:直接取2个值,将变量值拼接 echo $first second="$a$b" # 第二种方式来拼接字符串:在2个变量值最外面加字符串 echo $second third="${a}${b}" # 第三种方式拼接字符串:和第二种类似,就是加${}来进行变量取值。 echo $third
执行上面的脚本,可以看到脚本的执行结果,这3种方式执行的结果是一样的,上述3种均可拼接字符串:
123456
123456
123456
2.定义值为双引号或单引号的字符串
我们知道在shell中单引号和双引号有着特殊的含义,两者也是有区别的,但是如何才能定义一个字符串,使得字符串本身的值包含双引号或者单引号呢,下面的代码,我们给出了示例:
#!/bin/bash a="\"\"" b="'''" c='""' d='''' echo $a echo $b echo $c echo $d
执行上面的脚本,我们可以看到脚本的执行结果:
"" # 变量a的值为2个双引号
‘’‘ # 变量b的值为3个单引号
“” # 变量c的值为2个单引号
# 变量d的值为空
看到上面的执行结果,我们大致也明白了如何才能定义值为双引号或者单引号的字符串了,下面分享一下我总结的技术知识点:
定义值为双引号的字符串的方法有2种:
1.1 定义变量时,在最外层使用双引号,在双引号内部使用 \ 来对双引号进行转义,类似于变量a的定义方式。
1.2 定义变量时,在最外层使用单引号,在单引号内部直接写双引号来进行定义,类似于变量c的定义方式。
定义值为单引号的字符串方法:在最外层使用双引号,在双引号的内部直接写单引号来进行定义,类似于变量b的定义方式。
上述只是我总结的一些知识点,肯定有遗漏的地方或者其他方法,欢迎各位补充。其实,至于为什么会出现上述情况,个人认为其根本原因在于,shell脚本中单引号与双引号的作用不同。,感兴趣的人可以自行百度,正是两者的区别才导致出现来上述的情况。
3.在单引号和双引号字符串中取变量值
shell中使用单引号和双引号的区别导致了在单引号和双引号变量中取值的不同,下面,下面我们首先来看一个例子,为大家解释下两者的不同:
#!/bin/bash name="test" a='{ "name":$name, "age":"45" }' b="{ "name":$name, "age":"45" }" echo $a echo $b
执行上面一段shell脚本,可看到输出的结果:
{ "name":$name, "age":"45" } # 这是a的值
{ name:test, age:45 } # 这是b的值
通过上面的执行结果,我们可以看到以下几个问题:
- 变量a的定义与变量b的定义,唯一的区别在于a是单引号,b是双引号。
- 变量a的值并没有将name变量的值取出,变量b将name的值取出。
- 变量a中定义的属性名均带有双引号(例如:“name”), 变量b的值定义的属性名并没有带双引号(例如:name)
那么如何解决上述的第二个和第三个问题呢,首先来看第2个问题,下面给出我的一种解决方式:
在单引号定义的字符串里面,如果想要取到变量的值,需要在变量值上再加一层单引号
下面我们对之前的变量a的定义做一个改造,给出一个示例来说明结果.
#!/bin/bash name="test" a='{ "name":'$name', ---> 这里给a的定义多加了一层单引号 "age":"45" }' b="{ "name":$name, "age":"45" }" echo $a echo $b
再次执行上面的结果,我们可以看到执行结果:
{ "name":test, "age":"45" }
{ name:test, age:45 }
可以看到执行的结果,在变量a中,变量name的值确实被取出来,已进行赋值。
接下来,我们来看第3个问题,就是如何给变量b的属性名加双引号,这个问题的解决方法,类似于我们第二节中,如何定义值为双引号或者单引号的字符串。这里给出我的一个解决方法:利用转义字符。 下面给出我的示例:
name="test" a='{ "name":'$name', ---> 这里给a的定义多加了一层单引号 "age":"45" }' b="{ "\"name\"":$name, ---> 给每个属性值的双引号都加上了转义字符 "\"age\"":"\"45\"" }" echo $a echo $b
执行上面的结果,我们可以看到执行结果为:
{ "name":test, "age":"45" }
{ "name":test, "age":"45" }
可以看到两者的值保持一致,我们可以得出以下结论:
- 虽然两者实现了相同的功能,但是发现使用双引号的定义比较繁琐,使用单引号定义的方式比较简便。
- 在使用单引号定义时,要注意如果要取某个变量的值,要在变量值上加单引号来取变量值。
- 在使用双引号定义时,如果想正常显示双引号,需要使用转义字符来定义双引号。