在我们编写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
[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
2、用bash脚本显示目录文件列表
这是一个再简单不过的代码了,可是会让很多新手不知所措,看代码:
[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
结果出来了,每个文件和目录都粘连在一起了(空格分隔),不是我们想要的。为什么直接使用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
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