bash之變量引用有無雙引號差別

在咱們編寫bash腳本時,有時可能由於僅僅少了一個雙引號引用而使咱們大費周折,調試半天。因此,建議在使用變量時加上一個雙引號,不管在哪裏使用,這能夠避免一些沒必要要的麻煩,使調試陷入困境。具體看下面的代碼:

一、從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了,如咱們預期了

二、用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,按照咱們的預期輸出了,大功告成!
相關文章
相關標籤/搜索