歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> bash之變量引用有無雙引號差異

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

日期:2017/3/1 10:01:28   编辑:Linux編程

在我們編寫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,按照我們的預期輸出了,大功告成!
Copyright © Linux教程網 All Rights Reserved