變數是程式設計的重要組成部分,或者說它們是程式設計語言的精神。變數通過字元,數位和字母數位指定記憶體位置。它們通常在計算機程式中被參照和操縱。
變數是將資料或有用的資訊作為值儲存的容器。以下是變數的語法:
variable_name =value
變數是兩個單詞的組合形式,即variable+value
,變數的值可以更改,並且可以多次使用。
變數是任何型別的資料(例如整數,浮點數,字元等)的臨時儲存。變數名可以包含字母,數位和下劃線,並且其名稱只能以字母和下劃線開頭。
注意:不能定義以任何數位開頭的變數名稱。
如果沒有適當的資訊(語法,資料型別,型別,工作方式),我們將無法使用bash變數,因此,通過瀏覽此簡短教學,以獲取有關Bash變數的適當概述。
首先,了解語法:
Variable_name=value
定義Bash變數的規則集:
$
)符號。$
)。_
)書寫。x
和X
視為兩個不同的變數。=
)的兩側都不應有空格。以下是無效變數的一些範例,它們之間具有空格(由點...
表示),如下所示:var1=...variable1
var2...=variable2
var3...=...variable3
var1=variable
。要將多個單詞或字串作為單個項輸入到變數中,然後使用引號將內容包含在該變數中。''
)有助於處理每個字元。""
)有助於進行替換。在正式的程式設計語言中,必須在變數宣告時定義變數的資料型別。例如:
int year=2012
char comp_name='yizhi'
但是對於Bash,不必在變數宣告時定義變數的資料型別。Bash變數是無型別的,只需通過分配其值來鍵入變數名稱,它會自動判斷資料型別。
如果將數位值分配給變數,它將自動轉為整數工作,如果將字元值分配給該變數,則它將轉為字串型別。
year=2012
comp_name=yiibai
使用echo
命令,通過在名稱之前加上美元($
)號來讀取它們,例如:
echo $year
echo $name
Shell或UNIX系統中都有兩種型別的變數。
這些變數是由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
要了解系統中這些變數的列表,請在命令列終端上鍵入命令set
,env
和printenv
,如下所示:
set
命令。鍵入env
命令。
鍵入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步:儲存並執行指令碼,它將顯示輸出,如下圖所示:
這些變數由使用者建立和維護。通常,這些型別的變數以小寫形式定義。但是不強制的,也可以將變數名稱寫成大寫。
下面通過建立一個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步:儲存程式碼檔案,執行得到以下結果:
在基本演示了變數之後,接下來我們開始了解如何使用它們。
通常對Bash中的變數執行兩個操作,如下所示:
設定變數值有幾種方式,其中最常見的方法是直接設定值。要讀取變數,可以在指令碼中的任何位置放置變數名稱(注意:以$
符號開頭後加上變數名稱)。
Bash首先檢查所有變數名,就像它們在指令碼中一樣。然後,它將解釋指令碼的每一行。識別每個變數後,它將用分配的值替換每個變數名。它解釋/執行每一行程式碼,並針對指令碼的每個編碼行繼續執行此過程。
註:Bash中的兩種變數都可以在終端以及Bash指令碼上使用。下面通過一個簡單的範例了解它們如何在終端和Bash上的工作。
範例:通過呼叫使用者名,顯示使用者當前工作的位置以及使用的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"
執行上面範例程式碼,得到以下結果:
命令列引數用於通過將輸入傳遞給程式碼來使指令碼更具動態性。在指令碼執行時以以下形式傳遞這些引數:
./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]}
執行上面範例程式碼,得到以下結果:
根據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
執行上面範例程式碼,結果如下: