linux bash shell之變數替換::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法

來源:互聯網
上載者:User

linux bash shell之變數替換::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法

變數替換和變數預設值設定是緊密相關的,至少從概念出發是如此。

參數擴張是將類似於變數的參數用它的值來替換。例如以“echo $VAR”的形式調用一個簡單的變數。此外還有更多的特性可以訪問。這個句法還包含一些沒有擴充的特性,雖然這些特性自身很有意義。首先,這類特性執行預設變數賦值。使用這些特性時,整個運算式需要用花括弧括起來。

: ${VAR:=”some default”}

這些代碼開始的冒號是一個正確執行非活動任務的shell命令。在這個句法中,它僅僅擴充了行中緊隨其後的所有參數。本例中,只要是要在花括弧內擴充參數值。

本行ongoing冒號中的參數是最有趣的部分;它是用花括弧起來的一些邏輯的參數擴充。:=句法表示VAR變數將會和“some defalut”字串進行比較。

在這個運算式中,如果變數VAR還沒有被設定,那麼“:=”之後運算式的值將被賦給它,這個值可能是一個數字,一個字串,或者是另外一個變數。

系統中的腳步可能需要將多個變數設定成預設值。程式員可以在一行中給多個變數設定預設值,而不是編碼一組變數替換,這樣也使得代碼更加緊湊、易讀。下面的例子包含了程式員需要執行的各種替換操作。第一個預設值是一個顯示的串,第二個是一個顯示的整數,第三個是一個已定義的變數。

: ${VAR:=”some default”} ${VAR2:=42} ${VAR3:=$LOGNAME}

這幾個變數替換類型和前例中的:=句法類似。因為不同替換類型的句法都是相同的,不過它們的意義卻略有不同,可能很容易混淆。在大多數情況下,代碼中執行替換句法的地方,這些替換僅僅用某個值替換了變數,但是並沒有設定變數,也就是說變數並沒有被真正賦值。下面句法類型的定義在所有的shell聯機資料中找到的,但是這些說明通常不是很清楚。

:=句法

在這種替換中,使用和前例中相同的:=句法來設定預設值。

username=””

echo “${username:=$LOGNAME}”

在使用“:=”進行比較時,username變數已經被定義了,但是它的值為空白。因此,這裡對echo命令使用了變數LOGNAME的值,即設定變數username的值為LOGNAME的值。

有了這個特殊的句法,只有當變數username已被定義,而且有一個實際的非空值時,變數username才會被設定為變數LOGNAME的值。

和前例的主要不同是使用活動命令(echo)而不是被動的冒號來設定變數的預設值,當活動命令被調用時,預設賦值仍然會執行,並輸出顯示結果。

=句法

下面的語句和:=句法非常類似,但是沒有冒號。

username=””

echo “${username=$LOGNAME}”

和前面一樣,變數username已經被定義,但是它的值為空白。在這個句法中,命令將會輸出“echo”之後語句的執行結果。因為變數username雖然為空白值,但已經被定義了,所以除了一個斷行符號不會再有其他輸出。只有當username變數完全沒有定義時,才會將其設定為變數LOGNAME的值。

當指令碼或者函數需要依賴某些定義變數時,就要使用這種文法。它主要應用於登陸。如果一個特定環境變數還沒有被定義,就可以給它賦予指令碼所需要的值。

:-句法

在這個命令中,因為變數username雖然已被定義但是為空白值,echo語句將使用LOGNAME變數的值。

username=””

echo “${username:-$LOGNAME}”

這裡username變數的值保持不變。這個命令和使用=句文法的不同之處是,在此命令被執行前,僅僅在代碼中的“${}”句法中做替換。也就是說,echo命令將輸出LOGNAME變數的值,但是這個值不會被賦給username變數。

-句法

當刪除上述的:-語句中的冒號,即變成-的時候,因為username變數已被定義,輸出將為空白。如果未定義,就會使用LOGNAME變數的值。還有一點也與:-句法相同,即username變數的值沒有改變。

username=””

echo “${username-$LOGNAME}”

當指令碼評價或檢查系統內容的時,:-句法和-句法都可以使用。這兩種檢查基本上是相反的,它們用預設值替換變數,或者甚至於不依賴username變數是否已經被定義。如果指令碼中急需要一組被定義的變數,也需要一些不該被定義的變數,那麼在指令碼執行任務之前組合這兩種句法,肯定可以實現正確的設定。

句法

使用:?句法時,如果username變數已被定義為非空值,在echo命令中就會使用username變數的值。如果username變數已被定義但卻沒有一個真正的值(也就是說非空)或者完全未被定義,那麼在echo命令中就會使用LOGNAME的值,並且指令碼退出執行。

username=””

echo “${username:?$LOGNAME}”

如果把問號字元的參數改為某種錯誤字元,那這個語句就會在代碼調試和尋找未定義變數時變得很有用。這段代碼不僅僅輸出字串,而且會顯示代碼在指令碼中所在行的位置。

?句法

從:?句法中去掉冒號使用username變數不必一定為非空值。如果username只被設定為一個空值,那麼將使用這個空值。相反的,如果username變數沒有被定義,則同前所述的:?句法,執行LOGNAME替換,指令碼退出運行,並顯示退出時所在程式碼在指令碼中的位置。

username=””

echo “${username?$LOGNAME}”

在指令碼調試過程中,需要檢查變數是否已被定義或者是非空的是否,:?和?句法是非常有用的。這個代碼最大的優點是指令碼會從出錯行退出,而且會顯示出錯誤行行號。在要顯示的文本中加上類似於“is undefined”或者“has a null value”資訊,可以更清楚的說明指令碼中的問題。

:+句法

和前面的例子相比,這個句法有相反的作用。這這是因為,只有當變數已被定義而不是未定義的時候,“${}”運算式才執行替換。

username=””

echo “${username:+$LOGNAME}”

如果這裡的username變數已被定義而且非空,因此使用LOGNAME的值。如果username變數未定義,或者已定義但為空白,則將使用空值。在任何情況下,username變數的值都不會改變。

+句法

如果
前例:+中的冒號,一旦變數username被定義,“${}”運算式都將使用LOGNAME的值;進行這個替換時,username變數不需要有一個實際的值(即非空值)。如

username=””

echo “${username+$LOGNAME}”

“:+”、“+”句法的用法很多是喝“:-”、“-”句法的用法相同的。最主要的區別是“:+”、“+”樣本檢查的是一個已定義的變數,而不是未定義的變數。這類類似於家法、減法——一枚硬幣的兩面。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.