bash之变量引用有无双引号差异

在我们编写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,按照我们的预期输出了,大功告成!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a911ebe3050f70c4aec8b38543aa86fa.html