天天看點

編寫 Bash 腳本所需知道的一切

您可以使用 Bash 腳本自動執行各種任務。掌握基礎知識并開始您的 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=LinuxMiLOCATION="My Site is $STATE"echo $LOCATION      

聲明STATE變量後,此腳本通過引用 STATE 來定義LOCATION 。如果 then 使用 echo 列印 LOCATION 變量的最終值。

編寫 Bash 腳本所需知道的一切

printf關鍵字允許您使用格式化動詞來輸出資料。字元串格式化動詞類似于 C 和 Go 中的動詞,但動詞有限。

動詞 功能性
%C 列印單個字元
%o 列印八進制
%s 列印字元串,獨立于大小寫
%X 列印小寫十六進制
%X 列印大寫十六進制
%d 列印整數
%e 以小寫形式列印科學概念浮點數
%E 以大寫形式列印科學概念浮點數
%F 列印浮點數
%% 列印一個百分比符号。

這是一個使用帶有print關鍵字的動詞的示例。

STATE=LinuxMi.comprintf "My Site is %s" $STATE      
編寫 Bash 腳本所需知道的一切

printf函數将在%s動詞的位置替換STATE變量,輸出将是“My Location is Lagos”。

Bash 中的注釋

您可以在 Bash 中使用井号或井号 ( # ) 符号進行注釋。shell 會自動忽略注釋。

#!/bin/bash
# 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      

在上面的示例中,使用者輸入請求将位于新行上。

編寫 Bash 腳本所需知道的一切

您可以将-n标志添加到echo print 語句以保留使用者輸入輸入的行。

echo -n "What do you want."
read response
echo $response      
編寫 Bash 腳本所需知道的一切

在 Bash 中聲明數組

Bash中的數組就像大多數語言一樣。您可以通過在括号中指定元素來在 Bash 中聲明一個數組變量。

Countries=('Ubuntu' 'Debian' 'CentOS', "openSUSE", "Linuxmi.com")      

通過引用變量名通路數組将擷取第一個元素。您可以使用星号作為索引來通路整個數組。

echo ${Countries[*]}      

您還可以指定數組的索引來通路特定元素。數組的索引從零開始。

echo "${Countries[4]}"      
編寫 Bash 腳本所需知道的一切

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 腳本所需知道的一切

這是一個簡單的無限循環,用于示範 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 腳本所需知道的一切

函數可以在 Bash 中傳回變量。您所需要的隻是return關鍵字。

print_working_directory() {
  return $PWD
}      

print_working_directory函數傳回檔案的工作目錄。

你可以用其他語言編寫 Shell 腳本