加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

bash之变量引用有无双引号区别

发布时间:2021-11-21 20:47:52 所属栏目:教程 来源:互联网
导读:在我们编写bash脚本时,有时可能因为仅仅少了一个双引号引用而使我们大费周折,调试半天。所以,建议在使用变量时加上一个双引号,无论在哪里使用,这可以避免一些不必要的麻烦,使调试陷入困境。具体看下面的代码: 1、从SQLite中检索数据 [root@vm3 ~]# ca

在我们编写bash脚本时,有时可能因为仅仅少了一个双引号引用而使我们大费周折,调试半天。所以,建议在使用变量时加上一个双引号,无论在哪里使用,这可以避免一些不必要的麻烦,使调试陷入困境。具体看下面的代码:
 
 
1、从SQLite中检索数据
[root@vm3 ~]# cat t.sh
#!/bin/bash
 
sql="select count(*) from user"
ret=$(/usr/bin/sqlite3 /root/test.db $sql)
if [ $ret -eq 0 ];then
echo 'no record'
else
echo "total $ret records"
fi
这是一段比较简单和常见的代码格式,抱着很自信的态度运行它看看
[root@vm3 ~]# ./t.sh
SQL error: near "select": syntax error
./t.sh: line 5: [: -eq: unary operator expected
total records
结果不是我们预期的,出现了n多错误,这就是变量不加引号的结果,我们改之,如下:
[root@vm3 ~]# cat t.sh
#!/bin/bash
 
sql="select count(*) from user"
ret=$(/usr/bin/sqlite3 /root/test.db "$sql")
if [ "$ret" -eq 0 ];then
echo 'no record'
else
echo "total $ret records"
fi
我在变量的两边加了双引号,红色的部分。再次运行看看
[root@vm3 ~]# ./t.sh
total 2 records
ok了,如我们预期了
 
2、用bash脚本显示目录文件列表
这是一个再简单不过的代码了,可是会让很多新手不知所措,看代码:
[root@vm3 ~]# cat t.sh
#!/bin/bash
 
list=$(ls -l /boot)
echo $list
仅有2行代码,是不是很简单啊!运行之
[root@vm3 ~]# ./t.sh
总计 5956 -rw-r--r-- 1 root root 65937 2009-08-19 config-2.6.18-164.el5 drwxr-xr-x 2 root root 4096 12-23 19:14 grub -rw------- 1 root root 2703784 2012-04-20 initrd-2.6.18-164.el5.img -rw-r--r-- 1 root root 108707 2009-08-19 symvers-2.6.18-164.el5.gz -rw-r--r-- 1 root root 1225101 2009-08-19 System.map-2.6.18-164.el5 -rw-r--r-- 1 root root 1932316 2009-08-19 vmlinuz-2.6.18-164.el5
结果出来了,每个文件和目录都粘连在一起了(空格分隔),不是我们想要的。为什么直接使用ls命令就没有这个问题呢?
[root@vm3 ~]# ls -l /boot
总计 5956
-rw-r--r-- 1 root root 65937 2009-08-19 config-2.6.18-164.el5
drwxr-xr-x 2 root root 4096 12-23 19:14 grub
-rw------- 1 root root 2703784 2012-04-20 initrd-2.6.18-164.el5.img
-rw-r--r-- 1 root root 108707 2009-08-19 symvers-2.6.18-164.el5.gz
-rw-r--r-- 1 root root 1225101 2009-08-19 System.map-2.6.18-164.el5
-rw-r--r-- 1 root root 1932316 2009-08-19 vmlinuz-2.6.18-164.el5
这是因为我们输出变量的时候没有使用双引号,变量代表的所有内容直接暴露给shell,就是参数替换,形如:
echo 总计 5956 -rw-r--r-- 1 root root 65937 2009-08-19 config-2.6.18-164.el5 drwxr-xr-x 2 root root 4096 12-23 19:14 grub -rw------- 1 root root 2703784 2012-04-20 initrd-2.6.18-164.el5.img -rw-r--r-- 1 root root 108707 2009-08-19 symvers-2.6.18-164.el5.gz -rw-r--r-- 1 root root 1225101 2009-08-19 System.map-2.6.18-164.el5 -rw-r--r-- 1 root root 1932316 2009-08-19 vmlinuz-2.6.18-164.el5
所有的多个空格被一个空格代替,所有的换行被删除。要完全保留变量内容,我们就得使用双引号将其引起来,如下:
[root@vm3 ~]# cat t.sh
#!/bin/bash
 
list=$(ls -l /boot)
echo "$list"
注意红色的引号,我们再次运行
[root@vm3 ~]# ./t.sh
总计 5956
-rw-r--r-- 1 root root 65937 2009-08-19 config-2.6.18-164.el5
drwxr-xr-x 2 root root 4096 12-23 19:14 grub
-rw------- 1 root root 2703784 2012-04-20 initrd-2.6.18-164.el5.img
-rw-r--r-- 1 root root 108707 2009-08-19 symvers-2.6.18-164.el5.gz
-rw-r--r-- 1 root root 1225101 2009-08-19 System.map-2.6.18-164.el5
-rw-r--r-- 1 root root 1932316 2009-08-19 vmlinuz-2.6.18-164.el5
ok,按照我们的预期输出了,大功告成!

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读