Bash變數


變數是程式設計的重要組成部分,或者說它們是程式設計語言的精神。變數通過字元,數位和字母數位指定記憶體位置。它們通常在計算機程式中被參照和操縱。

1. 變數是什麼?

變數是將資料或有用的資訊作為值儲存的容器。以下是變數的語法:

variable_name =value

變數是兩個單詞的組合形式,即variable+value,變數的值可以更改,並且可以多次使用。
變數是任何型別的資料(例如整數,浮點數,字元等)的臨時儲存。變數名可以包含字母,數位和下劃線,並且其名稱只能以字母和下劃線開頭。

注意:不能定義以任何數位開頭的變數名稱。

2. Bash變數

如果沒有適當的資訊(語法,資料型別,型別,工作方式),我們將無法使用bash變數,因此,通過瀏覽此簡短教學,以獲取有關Bash變數的適當概述。

首先,了解語法:

Variable_name=value

定義Bash變數的規則集:

  • 在讀取或列印變數時,在變數名前加上美元($)符號。
  • 設定任何值的變數時,省略美元符號($)。
  • 變數名可以是字母數位,也可以用下劃線(_)書寫。
  • 變數名稱區分大小寫:xX視為兩個不同的變數。
  • 變數名可以使用大寫或小寫字母或兩者的混合形式編寫。
  • 變數可以放在Bash指令碼中的任何地方或命令列中,因為在執行時,Bash會將其替換為其分配的值。
  • 變數名稱與值之間的等號(=)的兩側都不應有空格。以下是無效變數的一些範例,它們之間具有空格(由點...表示),如下所示:
    var1=...variable1
    var2...=variable2
    var3...=...variable3
    
  • 不需要使用任何單引號或雙引號來定義具有單個字元值的變數,例如var1=variable。要將多個單詞或字串作為單個項輸入到變數中,然後使用引號將內容包含在該變數中。
    • 單引號('')有助於處理每個字元。
    • 雙引號("")有助於進行替換。

2. 資料型別

在正式的程式設計語言中,必須在變數宣告時定義變數的資料型別。例如:

int year=2012  
char comp_name='yizhi'

但是對於Bash,不必在變數宣告時定義變數的資料型別。Bash變數是無型別的,只需通過分配其值來鍵入變數名稱,它會自動判斷資料型別。

如果將數位值分配給變數,它將自動轉為整數工作,如果將字元值分配給該變數,則它將轉為字串型別。

year=2012  
comp_name=yiibai

使用echo命令,通過在名稱之前加上美元($)號來讀取它們,例如:

echo $year
echo $name

3. Bash變數型別

Shell或UNIX系統中都有兩種型別的變數。

  • 系統定義的變數
  • 使用者定義的變數

3.1.系統定義的變數

這些變數是由LINUX作業系統本身建立和維護的預定義變數。它們的標準約定是通常以大寫字母進行定義。因此,每當看到以大寫字母定義的變數時,很可能它們就是系統定義的變數。

這些是以下系統定義的變數,如下所示:

1.BASH表示Shell名稱。

範例:

BASH=/usr/bin/bash

2.BASH_VERSION指定Bash持有的shell版本。

範例:

BASH_VERSION=4.2.46(2)

3.COLUMNS指定編號,螢幕的列數。

範例:

COLUMNS=80

4.HOME為使用者指定主目錄。
範例:

HOME=/home/yiibai

5.LOGNAME指定紀錄檔記錄使用者名。

範例:

LOGNAME=yiibai

6.OSTYPE指示作業系統的型別。

範例:

OSTYPE=linux-gnu

7.PWD代表當前的工作目錄。

範例:

PWD=/home/maxsu

8.USERNAME指定當前登入使用者的名稱。

範例:

USERNAME=maxsu

要了解系統中這些變數的列表,請在命令列終端上鍵入命令setenvprintenv,如下所示:

  1. 鍵入set命令。
    set命令
  1. 鍵入env命令。
    env命令

  2. 鍵入printenv命令。
    printenv命令

下面演示如何通過Bash Shell呼叫這些變數。參考以下步驟:

第1步:建立一個指令碼檔案:bash_sdvar.sh,並在Bash控制台上編寫以下程式碼,如下所示:

#! /bin/bash  
# Bash System-defined Variables  
echo $HOME # Home Directory  
echo $PWD # current working directory  
echo $BASH # Bash shell name  
echo $BASH_VERSION # Bash shell Version  
echo $LOGNAME # Name of the Login User  
echo $OSTYPE # Type of OS

第2步:儲存並執行指令碼,它將顯示輸出,如下圖所示:

3.2. 使用者定義的變數

這些變數由使用者建立和維護。通常,這些型別的變數以小寫形式定義。但是不強制的,也可以將變數名稱寫成大寫。

下面通過建立一個Bash指令碼來定義一些變數,請按照以下步驟進行操作:

第1步:建立一個指令碼檔案:bash_udvar.sh,並在Bash控制台上鍵入以下程式碼:

#! /bin/bash  
# User-Defined Variables   
name=Maxsu  
ROLL_NO=525323  
echo "The student name is $name and his Roll number is $ROLL_NO."

第2步:儲存程式碼檔案,執行得到以下結果:
用戶定義的變量

4. Bash變數使用

在基本演示了變數之後,接下來我們開始了解如何使用它們。

通常對Bash中的變數執行兩個操作,如下所示:

  • 為變數設定值。
  • 讀取變數的值。

設定變數值有幾種方式,其中最常見的方法是直接設定值。要讀取變數,可以在指令碼中的任何位置放置變數名稱(注意:以$符號開頭後加上變數名稱)。

Bash首先檢查所有變數名,就像它們在指令碼中一樣。然後,它將解釋指令碼的每一行。識別每個變數後,它將用分配的值替換每個變數名。它解釋/執行每一行程式碼,並針對指令碼的每個編碼行繼續執行此過程。

註:Bash中的兩種變數都可以在終端以及Bash指令碼上使用。下面通過一個簡單的範例了解它們如何在終端和Bash上的工作。

範例:通過呼叫使用者名,顯示使用者當前工作的位置以及使用的Bash Shell版本。

4.1. 在終端上工作

在終端上工作

4.2. 在Bash Shell上工作

請參見下面給出的指令碼:bash-var.sh,程式碼如下:

#!/bin/bash
# Bash Variables
USER_NAME=maxsu
echo Hey there! maxsu is any user curently working on he directory $PWD with the Bash Shell Version $BASH_VERSION.

在指令碼的第三行,宣告了一個變數USER_NAME來儲存使用者名,值是:maxsu。在最後兩行中,使用echo命令列印訊息。此訊息中有兩個變數和一個命令,每個變數前面都有美元($)符號,其中:

  • USER_NAME是使用者定義的變數,用於呼叫使用者名的值。
  • BASH_VERSION是系統定義的變數,shell會自行呼叫。它用於列印Bash Shell的版本,
  • PWD命令用於列印使用者的當前位置。

接下來,執行上面指令碼:bash-var.sh,得到以下結果:

在終端和Bash Shell上還有一些練習使用變數的範例。通過遵循規則集(前面討論過),對變數進行如下練習:

A.使用命令列終端

1.設定變數
設置變量

2.讀取和參照變數
讀取和引用變量

3.無效的變數

maxsu@ubuntu:~$ bvar = value-2

Command 'bvar' not found, did you mean:

  command 'bear' from deb bear
  command 'bar' from deb bar

Try: sudo apt install <deb name>

maxsu@ubuntu:~$ bvar =value-2

Command 'bvar' not found, did you mean:

  command 'bar' from deb bar
  command 'bear' from deb bear

Try: sudo apt install <deb name>

maxsu@ubuntu:~$ bvar=value of var
of: command not found
maxsu@ubuntu:~$

4.結合兩個字串變數
結合兩個以上變量

5.用變數連線字串
用變量連接字符串

註:不要使用單引號來組合兩個變數,也不要將字串與變數串聯。如果通過將字串括在單引號中來連線字串,那麼將無法讀取它們,如下面的影象所示:

B.使用Bash指令碼:

下面是組合字串變數的範例。將下面程式碼儲存到檔案:bash-svar.sh

#!/bin/bash
# 結合兩個字串變數
str_var1="My name is:"
str_var2="Maxsu"
str_var3="Haikou"
echo "$str_var1: $str_var2, come from $str_var2"

執行上面範例程式碼,得到以下結果:

使用Bash腳本

5. 命令列引數

命令列引數用於通過將輸入傳遞給程式碼來使指令碼更具動態性。在指令碼執行時以以下形式傳遞這些引數:

 ./script_name arg1 arg2 arg3.....

指令碼名稱和所有傳遞的引數之間不要有空格。

如何使用命令列引數?

在Bash Shell中,它們與以下預設引數或特殊變數的參照一起使用。

  • $0 - 指定要呼叫的指令碼的名稱。
  • $1-$9 - 儲存前9個自變數的名稱,或可用作自變數的位置。
  • $# - 指定傳遞給指令碼的引數總數(計數)。
  • $* - 通過將所有命令列引數連線在一起來儲存它們。
  • $@ - 將引數列表儲存為陣列。
  • $? - 指定當前指令碼的進程ID。
  • $$ - 指定最後一個命令或最近執行過程的退出狀態。
  • $! - 顯示最後一個後台作業的ID。

以下是用於傳遞命令列引數的兩種方法:

方法1: 使用位置編號

下面是使用預設引數($1 ... $9)存取引數。下面對此進行了解釋,將以下程式碼儲存到檔案:bash-argm1.sh

#!/bin/bash
echo $0 ' > echo $0'
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 '>echo $1 $2 $3 $4 $5 $6 $7 $8 $9'

執行上面範例程式碼,得到以下結果:

使用位置編號

方法2:使用陣列

這是將引數作為陣列傳遞,按照給定的演算法應用此方法。

第1步:建立Bash指令碼。
第2步:宣告變數名稱,並將值分配為$a,格式如下:

variable_name=("$@")

其中$@是預設引數,用於將引數(傳遞)儲存為陣列。

第3步:通過以以下形式指定陣列索引來顯示引數的值:

${variable_name[i]}

第4步:儲存指令碼到檔案:bash-argm2.sh
第5步:通過傳遞引數來執行指令碼。

請參閱以下程式:

#!/bin/bash  

args=("$@")  

echo ${args[0]} ${args[1]} ${args[2]} ${args[3]}

執行上面範例程式碼,得到以下結果:

使用數組

6. 命令替換

根據Bash官方文件

「命令替換允許命令的輸出替換命令本身。Bash通過在子Shell環境中執行命令並用命令的標準輸出替換命令替換來執行擴充套件,並刪除任何尾隨的換行符。但可能會在拆分單詞時將其刪除。」

命令替換是指Bash執行的擴充套件。它獲取Bash命令的輸出,儲存在一個變數中(通常),並顯示回顯。

命令替換在指令碼和變數分配方面提供了資料靈活性。具有單個命令列輸出非常簡單。萬一輸出超出了幾行,然後刪除新的尾隨行,並且輸出的全部內容最終都在一行上。

請參閱使用語法:

將命令替換為變數或命令替換的經典形式是使用反引號,如下所示:

variable_name=`command_name`  
variable_name=`command_name [option...] argument1 argument2...`  
variable_name=`/path/to/command`

通過將命令放在方括號(以美元符號($)開頭)中來進行命令替換。如下:

variable_name=$(command_name)  
variable_name=$(command_name [option...] argument1 argument2...)  
variable_name=$(path/to/command)

在下面範例中,將單個命令ls替換為變數。請參閱終端上執行結果:
命令替換

第1行:不使用命令替換,輸出將擴充套件為多行。
第2行和第3行:使用命令替換,輸出在一行上結束(通過刪除新的尾隨行來節省空間)。

以下是Bash指令碼來測試命令替換。

範例程式:bash-cvs.sh

#! /bin/bash  

# command substitution  

lsresult=$(ls)  
echo "My soure code files are:" $lsresult

執行上面範例程式碼,結果如下:

命令替換