shell中變數被定義為星號(*)後無法引用的問題

來源:互聯網
上載者:User

標籤:*   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中變數被定義為星號(*)後無法引用的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.