編寫 Bash 腳本所需知道的一切
Bash 腳本可用于自動化任務,您會發現它們非常適合構建簡單的命令行應用程序。Bash shell 解釋 Bash 腳本,因此您無需安裝任何依賴項即可編寫和運行它們。Bash 腳本也是可移植的,因為大多數基于 Unix 的操作系統都使用相同的 shell 解釋器。
每個開發人員都必須具備 Bash 腳本知識,尤其是在使用基于 Unix 的系統時。
Bash 中的變量
Bash 變量區分大小寫。要聲明變量,請使用等號(=),名稱在左側,值在右側:
STATE=LinuxMi
此聲明分配給STATE的值是一個單詞。如果您的值中需要空格,請在其周圍使用引號:
STATE="Ubuntu Linux"
您需要使用美元符號($)前綴來引用其他變量或語句中的變量:
STATE=LinuxMi
LOCATION="My Site is $STATE"
在 Bash 中打印值
有幾種方法可以在 Bash 中打印變量。您可以使用echo命令進行基本輸出,或使用 C 風格的printf命令進行字符串格式化。
STATE=LinuxMi
LOCATION="My Site is $STATE"
echo $LOCATION
聲明STATE變量后,此腳本通過引用 STATE 來定義LOCATION 。如果 then 使用 echo 打印 LOCATION 變量的最終值。
printf關鍵字允許您使用格式化動詞來輸出數據。字符串格式化動詞類似于 C 和 Go 中的動詞,但動詞有限。
動詞 | 功能性 |
%C | 打印單個字符 |
%o | 打印八進制 |
%s | 打印字符串,獨立于大小寫 |
%X | 打印小寫十六進制 |
%X | 打印大寫十六進制 |
%d | 打印整數 |
%e | 以小寫形式打印科學概念浮點數 |
%E | 以大寫形式打印科學概念浮點數 |
%F | 打印浮點數 |
%% | 打印一個百分比符號。 |
這是一個使用帶有print關鍵字的動詞的示例。
STATE=LinuxMi.com
printf "My Site is %s" $STATE
printf函數將在%s動詞的位置替換STATE變量,輸出將是“My Location is Lagos”。
Bash 中的注釋
您可以在 Bash 中使用井號或井號 ( # ) 符號進行注釋。shell 會自動忽略注釋。
# STATE=LinuxMi.com
# LOCATION="My Site is $STATE"
沒有多行注釋。大多數 IDE 和文本編輯器允許您使用 Ctrl/Command + 正斜杠 (/) 快捷方式進行注釋。您應該能夠使用快捷方式創建多個單行注釋。
在 Bash 中接收用戶輸入
與許多其他編程語言一樣,您可以在 Bash 中接收用戶輸入,以使您的程序/腳本更具交互性。您可以使用read命令來請求用戶的輸入。
read response
在這種情況下,response變量將保存用戶在交付時的輸入。
echo "What do you want ?: "
read response
echo $response
在上面的示例中,用戶輸入請求將位于新行上。
您可以將-n標志添加到echo print 語句以保留用戶輸入輸入的行。
echo -n "What do you want."
read response
echo $response
在 Bash 中聲明數組
Bash中的數組就像大多數語言一樣。您可以通過在括號中指定元素來在 Bash 中聲明一個數組變量。
Countries=('Ubuntu' 'Debian' 'CentOS', "openSUSE", "Linuxmi.com")
通過引用變量名訪問數組將獲取第一個元素。您可以使用星號作為索引來訪問整個數組。
echo ${Countries[*]}
您還可以指定數組的索引來訪問特定元素。數組的索引從零開始。
echo "${Countries[4]}"
Bash 中的條件語句
Bash 為程序中的決策提供條件。
這是 Bash 中 if-else 語句的剖析。您必須使用分號來指定條件的結束。
if [[ condition ]]; then
echo statement1
elif [[condition ]]; then
echo statement2
else [[condition ]]; then
echo statement3
fi
您必須以fi關鍵字結束每個if語句。
if [ 1 == 2 ]; then
echo one
elif [ 2 == 3 ]; then #else-if
echo two
else [ 4 > 3 ];
echo "correct, 3"
fi
您可以使用case關鍵字在 Bash 程序中使用 case 語句。您必須指定模式,然后在語句之前加上括號。
NAME=LinuxMi
case $NAME in
"Debian") # 模式
echo "Debian是目前世界最大的非商業性Linux發行版之一" # 聲明
;; # case 結束
"LinuxMi" | "Ubuntu")
echo "openSUSE"
;;
"CentOS" | "oracle linux")
echo "linux"
;;
*) # 默認模式
echo "linuxmi.com" # 默認聲明
;;
esac # case聲明結束
您可以使用星號 (*) 符號作為模式定義默認大小寫。case 語句必須以esac關鍵字結尾。
Bash 中的循環
根據您的需要,您可以使用 while 循環、范圍 for 循環或 C 風格的 for 循環進行重復操作。
這是 C 風格的 for 循環的示例。For 循環必須以done關鍵字結尾,并且您必須以分號后跟do關鍵字結束 for 語句。
for ((a = 0 ; a < 10 ; a+2)); do
echo $a
done
對于處理文件和許多其他操作,for 循環的范圍很方便。您需要將in關鍵字與范圍 for 循環一起使用。
for i in {1..7}; do
echo $1
done
這是一個簡單的無限循環,用于演示 Bash while循環的實際作用。
linuxmi=1
while [ 1 -le 5 ] # while 1 < 5
do
echo $linuxmi
done
條件語句中的-le是小于的二元運算符。
Bash 中的函數
在 Bash 中聲明函數不需要關鍵字。您可以使用名稱聲明函數,然后在函數體之前加上括號。
print_working_directory() {
echo $PWD #從腳本調用PWD命令
}
echo "當前的目錄是 $(print_working_directory)"
函數可以在 Bash 中返回變量。您所需要的只是return關鍵字。
print_working_directory() {
return $PWD
}
print_working_directory函數返回文件的工作目錄。
你可以用其他語言編寫 Shell 腳本
Bash 并不是您可以用來與操作系統的 shell 交互或構建命令行應用程序的唯一語言。您可以使用許多其他語言,例如 Go、Python、Ruby 和 Rust。
許多操作系統都預裝了 Python3,而 Python 是一種流行的語言。如果您需要比 Bash 腳本提供的更多功能,請考慮使用 Python。