變數是編程的重要組成部分,或者說它們是編程語言的精神。變數通過字元,數字和字母數字指定記憶體位置。它們通常在電腦程式中被引用和操縱。
1. 變數是什麼?
變數是將數據或有用的資訊作為值存儲的容器。以下是變數的語法:
variable_name =value
變數是兩個單詞的組合形式,即variable+value
,變數的值可以更改,並且可以多次使用。
變數是任何類型的數據(例如整數,浮點數,字元等)的臨時存儲。變數名可以包含字母,數字和下劃線,並且其名稱只能以字母和下劃線開頭。
注意:不能定義以任何數字開頭的變數名稱。
2. Bash變數
如果沒有適當的資訊(語法,數據類型,類型,工作方式),我們將無法使用bash變數,因此,通過流覽此簡短教程,以獲取有關Bash變數的適當概述。
首先,瞭解語法:
Variable_name=value
定義Bash變數的規則集:
- 在讀取或列印變數時,在變數名前加上美元(
$
)符號。 - 設置任何值的變數時,省略美元符號(
$
)。 - 變數名可以是字母數字,也可以用下劃線(
_
)書寫。 - 變數名稱區分大小寫:
x
和X
視為兩個不同的變數。 - 變數名可以使用大寫或小寫字母或兩者的混合形式編寫。
- 變數可以放在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
要瞭解系統中這些變數的列表,請在命令行終端上鍵入命令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步:保存並執行腳本,它將顯示輸出,如下圖所示:
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"
執行上面示例代碼,得到以下結果:
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
運行上面示例代碼,結果如下: