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

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错

<

div id=”content”>在我们编写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

注意红色的引号,我们再次运行

<

div>

<

div>

[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 Syste

未经允许不得转载:演道网 » bash之变量引用有无双引号差异

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册