在我們編寫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,按照我們的預期輸出了,大功告成!