Linux中國

Bash 腳本編程入門

初學者們,讓我們在這個大型的教程中來認識一下 Bash 腳本編程。

Shell 是 Linux 的核心部分,它允許你使用各種諸如 cdlscat 等的命令與 Linux 內核進行交互。

Bash 是 Linux 上眾多可用的 Shell 中的一個。這些 Shell 主要的語法基本相同,但並非完全一樣。Bash 是目前最受歡迎的 Shell,並在大多數 Linux 發行版中被設為默認 Shell。

當你打開一個終端或 SSH 會話時,即使你無法真切地看到它,你其實已經在運行著一個 Shell。

當你輸入一個命令,它會被 Shell 解釋。如果命令和語法是正確的,它就會被執行,否則你會看到一個錯誤。

當你可以直接運行 Linux 命令時,為什麼還需要 Bash 腳本

你可以直接在終端輸入命令,它們就會被執行。

$ echo "hello world"
hello world

並且,同樣的操作也可以在腳本中進行:

$ cat >> script.sh
#!/bin/bash

echo "hello world"
$ bash script.sh
hello world

那麼,為什麼我們需要 Shell 腳本呢?因為你不必一遍又一遍地輸入同一個命令,你只需運行 Shell 腳本即可。

此外,如果你的腳本中有複雜的邏輯,把所有的命令都輸入到終端中可能並不是一個好主意。

例如,如果你輸入下面的命令,它會奏效,但這並不容易理解。不斷地輸入相同的命令(甚至要在 Bash 歷史記錄中搜索)會造成困擾。

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

相反,你可以把命令放進 shell 腳本中,這樣就更容易理解並且可以輕鬆運行了:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi

這還是比較簡單的情況。嘗試想像一下,一個複雜的腳本可能有五十行或一百行!

你將會學到什麼?

在這個 Bash 腳本教程中,有九個部分。你將會學到:

  • 創建並運行你的第一個 Bash Shell 腳本
  • 使用變數
  • 在你的 Bash 腳本中傳遞參數和接受用戶輸入
  • 進行數學計算
  • 操作字元串
  • 使用條件語句,例如 if-else
  • 使用 forwhileuntil 循環
  • 創建函數

? 所有的部分都會給你一個簡單的例子。如果你願意,你可以通過訪問每個部分的詳細章節來更深入地學習。這些章節也都包含了實踐練習。

這個教程的目標讀者是誰?

這個教程適合任何想要開始學習 Bash Shell 腳本的人。

如果你是一名學生,而你的課程里包括了 Shell 腳本,那麼這個系列就是為你準備的。

如果你是一個常規的桌面 Linux 用戶,這個系列將會幫助你理解在探索各種軟體和修復問題時遇到的大多數 Shell 腳本。你也可以使用它來自動化一些常見的、重複的任務。

在這個 Bash 腳本教程結束時,你應該可以編寫簡單的 Bash 腳本。

? 希望你已經擁有 Linux 命令行和編程語言的基礎知識。

如果你對 Linux 命令行完全不熟悉,我建議你先掌握基礎知識。

19 個你應該知道的基礎而重要的 Linux 終端技巧

你應該了解如何在命令行中進入特定的位置。為了做到這一點,你需要理解 Linux 文件系統中的路徑是如何工作的。

Linux 中的絕對路徑和相對路徑有什麼不同

接下來,這個教程系列會給你介紹目錄導航和文件操作的基本知識。

終端基礎:Linux 終端入門

1、編寫你的第一個 Bash Shell 腳本

創建一個名為 hello.sh 的新文件:

nano hello.sh

這將在終端中打開 nano 編輯器。在其中輸入以下幾行代碼:

#!/bin/bash
echo "Hello World"

通過按 Ctrl+X 鍵可以保存並退出 nano 編輯器。

現在,你可以以以下方式運行 Bash Shell 腳本:

bash hello.sh

你應該可以看到以下的輸出:

Hello World

另一種方式是首先賦予腳本執行許可權:

chmod u+x hello.sh

然後這樣運行它:

./hello.sh

? 你也可以使用基於圖形用戶界面的文本編輯器來編寫腳本。這可能更適合編寫較長的腳本。然而,你需要切換到保存腳本的目錄中才能運行它。

恭喜!你剛剛運行了你的第一個 Bash 腳本。

Bash 基礎知識系列 #1:創建並運行你的第一個 Bash Shell 腳本

2、在 Bash 腳本中使用變數

變數的聲明方式如下:

var=some_value

然後可以像這樣訪問變數:

$var

? 在聲明變數時,等號(=)前後不能有空格。

我們通過添加一個變數來修改前面的腳本。

#!/bin/bash
message="Hello World"
echo $message

如果運行這個腳本,輸出仍然會保持不變。

Hello World

Bash 基礎知識系列 #2:在 Bash 中使用變數

3、向 Bash 腳本傳遞參數

你可以在運行 Bash 腳本時以以下方式傳遞參數:

./my_script.sh arg1 arg2

在腳本中,你可以使用 $1 來代表第 1 個參數,用 $2 來代表第 2 個參數,以此類推。$0 是一個特殊變數,它代表正在運行的腳本的名字。

現在,創建一個新的 shell 腳本,命名為 arguments.sh,並向其中添加以下幾行代碼:

#!/bin/bash

echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

使其可執行並像這樣運行它:

$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash

讓我們快速看一下特殊變數:

特殊變數 描述
$0 腳本名稱
$1$2...$9 腳本參數
${n} 10 到 255 的腳本參數
$# 參數數量
$@ 所有參數一起
$$ 當前 shell 的進程 id
$! 最後執行命令的進程 id
$? 最後執行命令的退出狀態

你也可以通過接受鍵盤輸入使你的 Bash 腳本變得互動式。

為此,你必須使用 read 命令。你還可以使用 read -p 命令提示用戶進行鍵盤輸入,而不需要 echo 命令。

#!/bin/bash

echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

現在,如果你運行這個腳本,當系統提示你輸入「參數」時,你必須輸入。

$ ./argument.sh
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash

Bash 基礎知識系列 #3:傳遞參數和接受用戶輸入

4、執行算術運算

在 Bash Shell 中執行算術運算的語法是這樣的:

$((arithmetic_operation))

下面是你可以在 Bash 中執行的算術運算的列表:

操作符 描述
+ 加法
- 減法
* 乘法
/ 整數除法(沒有小數)
% 模運算(只余)
** 指數(a 的 b 次方)

以下是在 Bash 腳本中進行加法和減法的示例:

#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

你可以執行 Shell 腳本,使用你選擇的任意數字作為參數。

如果你嘗試除法,會出現一個大問題。Bash 只使用整數。默認情況下,它沒有小數的概念。因此,你會得到 10/3 的結果為3,而不是 3.333。

對於浮點數運算,你需要這樣使用 bc 命令:

#!/bin/bash

num1=50
num2=6

result=$(echo "$num1/$num2" | bc -l)

echo "The result is $result"

這個時候,你將看到準確的結果。

    The result is 8.33333333333333333333

Bash 基礎知識系列 #4:算術運算

5、在 Bash 腳本中使用數組

你可以使用 Bash 中的數組來存儲同一類別的值,而不是使用多個變數。

你可以像這樣聲明一個數組:

distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

要訪問一個元素,使用:

${array_name[N]}

像大多數其他的編程語言一樣,數組的索引從 0 開始。

你可以像這樣顯示數組的所有元素:

${array[*]}

這樣獲取數組長度:

${#array_name[@]}

Bash 基礎知識系列 #5:在 Bash 中使用數組

6、Bash 中的基礎字元串操作

Bash 能夠執行許多字元串操作。

你可以使用這種方式獲取字元串長度:

${#string}

連接兩個字元串:

str3=$str1$str2

提供子字元串的起始位置和長度來提取子字元串:

${string:$pos:$len}

這裡有一個例子:

你也可以替換給定字元串的一部分:

${string/substr1/substr2}

並且你也可以從給定字元串中刪除一個子字元串:

    ${string/substring}

Bash 基礎知識系列 #6:處理字元串操作

7、在 Bash 中使用條件語句

你可以通過使用 ifif-else 語句為你的 Bash 腳本添加條件邏輯。這些語句以 fi 結束。

單個 if 語句的語法是:

if [ condition ]; then
  your code
fi

注意使用 [ ... ];then

if-else 語句的語法是:

if [ expression ]; then
    ## execute this block if condition is true else go to next
elif [ expression ]; then
    ## execute this block if condition is true else go to next
else
    ## if none of the above conditions are true, execute this block
fi

這裡有一個使用 if-else 語句的 Bash 腳本示例:

#!/bin/bash

read -p "Enter the number: " num
mod=$(($num%2))

if [ $mod -eq 0 ]; then
    echo "Number $num is even"
else
    echo "Number $num is odd"
fi

運行它,你應該能看到這樣的結果:

-eq 被稱為測試條件或條件操作符。有許多這樣的操作符可以給你不同類型的比較:

這些是你可以用來進行數值比較的測試條件操作符:

條件 當...時,等同於 true
$a -lt $b $a < $b$a 是小於 $b
$a -gt $b $a > $b$a 是大於 $b
$a -le $b $a <= $b$a 是小於或等於 $b
$a -ge $b $a >= $b$a 是大於或等於 $b
$a -eq $b $a == $b$a 等於 $b
$a -ne $b $a != $b$a 不等於 $b

如果你在進行字元串比較,你可以使用以下這些測試條件:

條件 當...時,等同於 true
"$a" = "$b" $a 等同於 $b
"$a" == "$b" $a 等同於 $b
"$a" != "$b" $a 不同於 $b
-z "$a" $a 是空的

還有些條件用於檢查文件類型:

條件 當...時,等同於 true
-f $a $a 是一個文件
-d $a $a 是一個目錄
-L $a $a 是一個鏈接

? 要特別注意空格。開括弧和閉括弧、條件之間必須有空格。同樣地,條件操作符(-le== 等)之前和之後必須有空格。

Bash 基礎知識系列 #7:If-Else 語句

8、使用 Bash 腳本中的循環

Bash 支持三種類型的循環:forwhileuntil

這是 for 循環的一個例子:

#!/bin/bash

for num in {1..10}; do
    echo $num
done

運行它,你將看到以下輸出:

1
2
3
4
5
6
7
8
9
10

如果你選擇使用上面的示例,可以使用 while 循環這樣重寫:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
    echo $num
    num=$(($num+1))
done

同樣,可以使用 until 循環來重寫:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
    echo $num
    num=$(($num+1))
done

? while 循環和 until 循環非常相似。區別在於:while 循環在條件為真時運行,而 until 循環在條件為假時運行。

Bash 基礎知識系列 #8:For、While 和 Until 循環

9、在 Bash 腳本中使用函數

Bash Shell 支持使用函數,這樣你不必反覆編寫相同的代碼片段。

這是聲明 Bash 函數的通用語法:

function_name() {
  commands
}

這是一個使用帶參數的函數的 Bash 腳本樣例:

#!/bin/bash

sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}

echo "Let&apos;s use the sum function"
sum 1 5

如果你運行該腳本,你將看到以下輸出:

Let&apos;s use the sum function
The sum of 1 and 5 is: 6

Bash 基礎知識系列 #9:Bash 中的函數

接下來呢?

這只是一個初窺。這個 Bash 腳本教程只是一篇引言。Bash 腳本的內容還有很多,你可以慢慢地、逐漸地探索。

GNU Bash 參考是一份優秀的在線資源,可以解答你的 Bash 疑問。

GNU Bash 參考

除此之外,你可以下載這本免費書籍來學習更多在此未涵蓋的 Bash 內容:

下載 Bash 初學者指南

一旦你具有足夠的 Bash 基礎知識,你可以通過這本免費書籍來學習高級 Bash 腳本:

下載高級 Bash 編程指南

這兩本書至少都有十年的歷史,但你仍然可以使用它們來學習 Bash。

? 希望你喜歡這個作為學習 Bash 腳本起點的教程。請在評論區提供你的反饋。

(題圖:MJ/98f47121-7426-4297-9242-8683ccf0496d)

via: https://itsfoss.com/bash-scripting-tutorial/

作者:Abhishek Prakash 選題:lujun9972 譯者:ChatGPT 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國