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=zaixian

使用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/zaixian

5.LOGNAME指定日誌記錄用戶名。

示例:

LOGNAME=zaixian

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

運行上面示例代碼,結果如下:

命令替換


上一篇: Bash引號 下一篇: Bash讀取用戶輸入