linux在引号中引用变量,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,按照我们的预期输出了,大功告成!0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值