標籤:* shell 變數
在編寫shell指令碼的過程中,有的時候難免會用到一些變數值被定義為(*)的變數,但是當我們試圖引用這個變數的時候bash有預設會把(*)替換成目前的目錄下的所有檔案名稱的列表,如下:
[[email protected]_102 ~]# a=*[[email protected]_102 ~]# echo $aanaconda-ks.cfg install.log install.log.syslog[[email protected]_102 ~]# ls anaconda-ks.cfg install.log install.log.syslog
這個時候我們可以考慮一個問題:這裡的(*)是在哪一步被替換成目前的目錄下面的檔案清單的呢:是在第一步,變數賦值的時候就被替換的呢還是說,在echo變數值的時候被替換的呢?
事實是這樣子的:
1、當變數複製的時候,bash會直接將(*)賦值給變數a;
2、但是在第二步引用變數的時候,bash預設會把(*)替換成目前的目錄下的所有檔案的列表,大家可以這麼實驗一下:
[[email protected]_102 ~]# echo *anaconda-ks.cfg install.log install.log.syslog
但是如何把變數a的值取出來呢,這個時候就把變數引用時引號的作用給體現出來了:
當我們引用變數時,無引號、單引號、雙引號的區別:()
[[email protected]_102 ~]# echo "$a" #將引號裡面的變數替換成相對應變數值*[[email protected]_102 ~]# echo ‘$a‘$a #將引號裡面的字元統統不做轉義,全部按字串輸出
後面的問題接踵而至,當我想要在shell指令碼中使用if語句判斷某個變數的變數值是否為(*)的時候有報錯了:
[[email protected]_102 ~]# [[ "$a" -eq * ]] && echo aa || echo bb-bash: [[: *: syntax error: operand expected (error token is "*")bb
於是想了一下,會不會是(*)沒加雙引號的原因呢:
[[email protected]_102 ~]# [[ "$a" -eq "*" ]] && echo aa || echo bb-bash: [[: *: syntax error: operand expected (error token is "*")bb
好吧,不行的,那把(-eq)換成(==)試下:
[[email protected]_102 ~]# [[ "$a" == "*" ]] && echo aa || echo bbaa[[email protected]_102 ~]# [[ "$a" == * ]] && echo aa || echo bbaa[[email protected]_102 ~]# [[ $a == "*" ]] && echo aa || echo bbaa[[email protected]_102 ~]# [[ $a == * ]] && echo aa || echo bbaa
大家可能會奇怪,為什麼最後一條都沒加引號也是可以的呢,這裡我們可以再做一個實驗看下:
我們將目前的目錄下的所有檔案名稱的列表作為變數值賦給c
[[email protected]_102 ~]# echo $aanaconda-ks.cfg install.log install.log.syslog[[email protected]_102 ~]# c="anaconda-ks.cfg install.log install.log.syslog"[[email protected]_102 ~]# [[ "$c" == * ]] && echo aa || echo bbaa[[email protected]_102 ~]# [[ "$c" == "*" ]] && echo aa || echo bbbb
這個時候我們可以看到出,當兩邊都不加雙引號的時候,(==)兩邊都是目前的目錄下的所有檔案的列表作為變數值來進行比較,最後也是相等的;
但是當一邊加引號、一邊不加的時候為什麼也相等,暫時還解釋不了,如果各位知道為什麼,麻煩在下方的評論區告知一下,不勝感激。
本文出自 “紅樓遺夢” 部落格,請務必保留此出處http://leidongya.blog.51cto.com/7375845/1588056
shell中變數被定義為星號(*)後無法引用的問題