Bash 腳本編程入門
Shell 是 Linux 的核心部分,它允許你使用各種諸如 cd、ls、cat 等的命令與 Linux 內(nèi)核進行交互。
Bash 是 Linux 上眾多可用的 Shell 中的一個。這些 Shell 主要的語法基本相同,但并非完全一樣。Bash 是目前最受歡迎的 Shell,并在大多數(shù) Linux 發(fā)行版中被設(shè)為默認(rèn) Shell。
當(dāng)你打開一個終端或 SSH 會話時,即使你無法真切地看到它,你其實已經(jīng)在運行著一個 Shell。
當(dāng)你輸入一個命令,它會被 Shell 解釋。如果命令和語法是正確的,它就會被執(zhí)行,否則你會看到一個錯誤。
你可以直接在終端輸入命令,它們就會被執(zhí)行:
$ echo "hello world"
hello world
并且,同樣的操作也可以在腳本中進行:
$ cat >> script.sh
#!/bin/bash
echo "hello world"
$ bash script.sh
hello world
那么,為什么我們需要 Shell 腳本呢?因為你不必一遍又一遍地輸入同一個命令,你只需運行 Shell 腳本即可。
此外,如果你的腳本中有復(fù)雜的邏輯,把所有的命令都輸入到終端中可能并不是一個好主意。
例如,如果你輸入下面的命令,它會奏效,但這并不容易理解。不斷地輸入相同的命令(甚至要在 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
這還是比較簡單的情況。嘗試想象一下,一個復(fù)雜的腳本可能有五十行或一百行!
在這個 Bash 腳本教程中,有九個部分。你將會學(xué)到:
創(chuàng)建并運行你的第一個 Bash Shell 腳本
使用變量
在你的 Bash 腳本中傳遞參數(shù)和接受用戶輸入
進行數(shù)學(xué)計算
操作字符串
使用條件語句,例如 if-else
使用 for、while 和 until 循環(huán)
創(chuàng)建函數(shù)
所有的部分都會給你一個簡單的例子。如果你愿意,你可以通過訪問每個部分的詳細(xì)章節(jié)來更深入地學(xué)習(xí)。這些章節(jié)也都包含了實踐練習(xí)。
這個教程適合任何想要開始學(xué)習(xí) Bash Shell 腳本的人。
如果你是一名學(xué)生,而你的課程里包括了 Shell 腳本,那么這個系列就是為你準(zhǔn)備的。
如果你是一個常規(guī)的桌面 Linux 用戶,這個系列將會幫助你理解在探索各種軟件和修復(fù)問題時遇到的大多數(shù) Shell 腳本。你也可以使用它來自動化一些常見的、重復(fù)的任務(wù)。
在這個 Bash 腳本教程結(jié)束時,你應(yīng)該可以編寫簡單的 Bash 腳本。
希望你已經(jīng)擁有 Linux 命令行和編程語言的基礎(chǔ)知識。
創(chuàng)建一個名為 hello.sh 的新文件:
nano hello.sh
這將在終端中打開 nano 編輯器。在其中輸入以下幾行代碼:
#!/bin/bash
echo "Hello World"
通過按 Ctrl+X 鍵可以保存并退出 nano 編輯器。
現(xiàn)在,你可以以以下方式運行 Bash Shell 腳本:
bash hello.sh
你應(yīng)該可以看到以下的輸出:
Hello World
另一種方式是首先賦予腳本執(zhí)行權(quán)限:
chmod u+x hello.sh
然后這樣運行它:
./hello.sh
你也可以使用基于圖形用戶界面的文本編輯器來編寫腳本。這可能更適合編寫較長的腳本。然而,你需要切換到保存腳本的目錄中才能運行它。
恭喜!你剛剛運行了你的第一個 Bash 腳本。
變量的聲明方式如下:
var=some_value
然后可以像這樣訪問變量:
$var
在聲明變量時,等號(=)前后不能有空格。
我們通過添加一個變量來修改前面的腳本。
#!/bin/bash
message="Hello World"
echo $message
如果運行這個腳本,輸出仍然會保持不變。
Hello World
你可以在運行 Bash 腳本時以以下方式傳遞參數(shù):
./my_script.sh arg1 arg2
在腳本中,你可以使用 $1 來代表第 1 個參數(shù),用 $2 來代表第 2 個參數(shù),以此類推。$0 是一個特殊變量,它代表正在運行的腳本的名字。
現(xiàn)在,創(chuàng)建一個新的 shell 腳本,命名為 arguments.sh,并向其中添加以下幾行代碼:
#!/bin/bash
echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"
使其可執(zhí)行并像這樣運行它:
$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash
讓我們快速看一下特殊變量:
你也可以通過接受鍵盤輸入使你的 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"
現(xiàn)在,如果你運行這個腳本,當(dāng)系統(tǒng)提示你輸入“參數(shù)”時,你必須輸入。
$ ./argument.sh
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash
在 Bash Shell 中執(zhí)行算術(shù)運算的語法是這樣的:
$((arithmetic_operation))
下面是你可以在 Bash 中執(zhí)行的算術(shù)運算的列表:
以下是在 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"
你可以執(zhí)行 Shell 腳本,使用你選擇的任意數(shù)字作為參數(shù)。
如果你嘗試除法,會出現(xiàn)一個大問題。Bash 只使用整數(shù)。默認(rèn)情況下,它沒有小數(shù)的概念。因此,你會得到 10/3 的結(jié)果為3,而不是 3.333。
對于浮點數(shù)運算,你需要這樣使用 bc 命令:
#!/bin/bash
num1=50
num2=6
result=$(echo "$num1/$num2" | bc -l)
echo "The result is $result"
這個時候,你將看到準(zhǔn)確的結(jié)果。
The result is 8.33333333333333333333
5、在 Bash 腳本中使用數(shù)組
你可以使用 Bash 中的數(shù)組來存儲同一類別的值,而不是使用多個變量。
你可以像這樣聲明一個數(shù)組:
distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)
要訪問一個元素,使用:
${array_name[N]}
像大多數(shù)其他的編程語言一樣,數(shù)組的索引從 0 開始。
你可以像這樣顯示數(shù)組的所有元素:
${array[*]}
這樣獲取數(shù)組長度:
${#array_name[@]}
6、Bash 中的基礎(chǔ)字符串操作
Bash 能夠執(zhí)行許多字符串操作。
你可以使用這種方式獲取字符串長度:
${#string}
連接兩個字符串:
str3=$str1$str2
提供子字符串的起始位置和長度來提取子字符串:
${string:$pos:$len}
這里有一個例子:
你也可以替換給定字符串的一部分:
${string/substr1/substr2}
并且你也可以從給定字符串中刪除一個子字符串:
${string/substring}
Bash 基礎(chǔ)知識系列 #6:處理字符串操作
7、在 Bash 中使用條件語句
你可以通過使用 if 或 if-else 語句為你的 Bash 腳本添加條件邏輯。這些語句以 fi 結(jié)束。
單個 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
運行它,你應(yīng)該能看到這樣的結(jié)果:
-eq 被稱為測試條件或條件操作符。有許多這樣的操作符可以給你不同類型的比較:
這些是你可以用來進行數(shù)值比較的測試條件操作符:
如果你在進行字符串比較,你可以使用以下這些測試條件:
還有些條件用于檢查文件類型:
要特別注意空格。開括號和閉括號、條件之間必須有空格。同樣地,條件操作符(-le、== 等)之前和之后必須有空格。
8、使用 Bash 腳本中的循環(huán)
Bash 支持三種類型的循環(huán):for、while 和 until。
這是 for 循環(huán)的一個例子:
#!/bin/bash
for num in {1..10}; do
echo $num
done
運行它,你將看到以下輸出:
1
2
3
4
5
6
7
8
9
10
如果你選擇使用上面的示例,可以使用 while 循環(huán)這樣重寫:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $num
num=$(($num+1))
done
同樣,可以使用 until 循環(huán)來重寫:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $num
num=$(($num+1))
done
while 循環(huán)和 until 循環(huán)非常相似。區(qū)別在于:while 循環(huán)在條件為真時運行,而 until 循環(huán)在條件為假時運行。
9、在 Bash 腳本中使用函數(shù)
Bash Shell 支持使用函數(shù),這樣你不必反復(fù)編寫相同的代碼片段。
這是聲明 Bash 函數(shù)的通用語法:
function_name() {
commands
}
這是一個使用帶參數(shù)的函數(shù)的 Bash 腳本樣例:
#!/bin/bash
sum() {
sum=$(($1+$2))
echo "The sum of $1 and $2 is: $sum"
}
echo "Let's use the sum function"
sum 1 5
如果你運行該腳本,你將看到以下輸出:
Let's use the sum function
The sum of 1 and 5 is: 6
接下來呢?
這只是一個初窺。這個 Bash 腳本教程只是一篇引言。Bash 腳本的內(nèi)容還有很多,你可以慢慢地、逐漸地探索。