5個Linux新手學習Shell程式設計的Shell指令碼


如果您是Linux新手,一開始學習shell指令碼編寫可能會覺得很困難。但是,在使用Linux系統時,shell指令碼編寫是一項非常有用的技能。Shell指令碼可以自動化重複性任務,執行系統管理任務,甚至可以幫助軟體開發。

在本文中,我們將介紹五個Linux新手可以學習的shell指令碼,以開始學習shell程式設計。我們將介紹shell指令碼的一些基礎知識,並提供每個指令碼的示例,以幫助您瞭解它們的工作原理。

什麼是Shell指令碼?

Shell指令碼是用在Unix/Linux shell中執行的指令碼語言編寫的程式。Shell指令碼是一個強大的工具,允許您自動化任務,執行系統管理任務,甚至建立軟體。

Shell指令碼在命令列介面中執行,它們可以用於執行各種各樣的任務,從基本的 檔案管理到複雜的資料處理。

指令碼1:Hello World

每個程式設計師學習的第一個指令碼是經典的“Hello, World!”程式。這是一個簡單的指令碼,只需將訊息列印到螢幕上。以下是指令碼的樣子:

示例

#!/bin/bash
echo "Hello, World!"

輸出

Hello, World!

讓我們分解一下。指令碼的第一行稱為“shebang”行,它告訴shell使用哪個直譯器來執行指令碼。在本例中,我們使用的是bash shell。

第二行是實際命令,它將訊息列印到螢幕上。echo命令簡單地顯示其後的文字。

要執行指令碼,將其儲存到檔案(例如,hello.sh),使用chmod +x hello.sh命令使其可執行,然後使用./hello.sh執行它。

指令碼2:簡單的計算器

接下來我們將介紹一個簡單的計算器指令碼。這個指令碼從使用者那裡獲取兩個數字作為輸入,並在它們上執行基本的算術運算。以下是指令碼的樣子:

示例

#!/bin/bash
echo "Enter first number: "
read num1
echo "Enter second number: "
read num2
echo "The sum is: $((num1 + num2))"

輸出

Enter first number: 
Enter second number: 
The sum is: 0

讓我們分解一下。指令碼的前兩行提示使用者輸入兩個數字,然後將這些數字讀入num1和num2變數。

第三行執行實際計算。在本例中,我們使用$(( ))語法將num1和num2加在一起。

要執行指令碼,將其儲存到檔案(例如,calculator.sh),使用chmod +x calculator.sh命令使其可執行,然後使用./calculator.sh執行它。

指令碼3:檔案備份

接下來我們將介紹一個檔案備份指令碼。這個指令碼將檔案複製到備份目錄,並在檔名中新增時間戳。以下是指令碼的樣子:

#!/bin/bash
backup_dir=/path/to/backup/dir/
filename=file.txt
cp $filename $backup_dir/${filename}_$(date +%Y-%m-%d_%H-%M-%S)

讓我們分解一下。指令碼的第一行將名為backup_dir的變數設定為備份目錄的路徑。

第二行將名為filename的變數設定為我們要備份的檔名。

第三行使用cp命令將檔案複製到備份目錄。${filename}_$(date +%Y-%m-%d_%H-%M-%S)語法在檔名的末尾新增時間戳,以便每個備份都有唯一名稱。

要執行指令碼,將其儲存到檔案(例如,backup.sh),使用chmod +x backup.sh命令使其可執行,然後使用./backup.sh執行它。

指令碼4:系統資訊

接下來我們將介紹一個系統資訊指令碼。這個指令碼顯示有關係統的資訊,例如作業系統、核心版本和CPU資訊。以下是指令碼的樣子:

示例

#!/bin/bash
echo "Operating system: $(uname -o)"
echo "Kernel version: $(uname -r)"
echo "CPU information: $(lscpu | grep "Model name" | awk '{print $3, $4, $5, $6, $7, $8}')"

輸出

Operating system: GNU/Linux
Kernel version: 5.15.0-60-generic
CPU information: AMD Ryzen 9 5950X 16-Core Processor

讓我們分解一下。指令碼的第一行是shebang行,和往常一樣。

接下來的三行使用各種命令來顯示系統資訊。uname -o命令顯示作業系統,uname -r命令顯示核心版本,lscpu | grep "Model name" | awk '{print $3, $4, $5, $6, $7, $8}'命令顯示CPU資訊。

要執行指令碼,將其儲存到檔案(例如,systeminfo.sh),使用chmod +x systeminfo.sh命令使其可執行,然後使用./systeminfo.sh執行它。

指令碼5:密碼生成器

我們將介紹的最後一個指令碼是一個密碼生成器。這個指令碼使用大寫和小寫字母、數字和特殊字元的組合生成隨機密碼。以下是指令碼的樣子:

示例

#!/bin/bash
length=12
password=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#$%^&*()_+-=' | fold -w $length | head -n 1)
echo "Your new password is: $password"

輸出

Your new password is: YRY+zm:<JwYi

讓我們分解一下。指令碼的第一行是shebang行,和往常一樣。

第二行將名為length的變數設定為所需的密碼長度。

第三行使用cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#$%^&*()_+-=' | fold -w $length | head -n 1命令生成隨機密碼。此命令使用cat /dev/urandom命令生成隨機資料,然後使用tr命令過濾掉不需要的字元。fold -w $length命令將輸出分成所需長度的行,head -n 1命令選擇第一行(即密碼)。

要執行指令碼,將其儲存到檔案(例如,password.sh),使用chmod +x password.sh命令使其可執行,然後使用./password.sh執行它。

指令碼6:檔案搜尋

允許您根據關鍵字搜尋目錄或子目錄中檔案的指令碼。這是一個示例:

#!/bin/bash
echo "Enter directory to search: "
read dir
echo "Enter keyword to search for: "
read keyword
find $dir -name "*$keyword*" -print

此指令碼提示使用者輸入要搜尋的目錄和關鍵字,然後使用find命令搜尋名稱中包含該關鍵字的檔案。

指令碼7:目錄備份

一個指令碼,用於將整個目錄(包括子目錄和檔案)備份到備份位置。這是一個示例:

#!/bin/bash
src_dir=/path/to/src/dir/
backup_dir=/path/to/backup/dir/
tar -czf $backup_dir/backup_$(date +%Y-%m-%d_%H-%M-%S).tar.gz $src_dir

此指令碼設定源目錄和備份目錄的變數,然後使用tar命令在備份目錄中建立源目錄的壓縮存檔,並在檔名中新增時間戳。

指令碼8:程序監控

一個監控特定程序並在程序停止執行時傳送警報的指令碼。這是一個示例:

#!/bin/bash
process_name=myprocess
while true
do
   if ps aux | grep $process_name | grep -v grep > /dev/null
   then
      sleep 1
   else
      echo "$process_name has stopped running."
      mail -s "Process Monitor Alert" user@example.com <<< "$process_name has stopped running."
      break
   fi
done

此指令碼使用while迴圈持續檢查是否使用ps命令執行具有特定名稱的程序。如果程序未執行,則指令碼使用mail命令向指定的傳送電子郵件警報。

指令碼9:網頁抓取

一個從網站提取資料並將其儲存在檔案或資料庫中的指令碼。這是一個使用curl和grep命令的示例:

#!/bin/bash
url="http://example.com"
data=$(curl -s $url)
echo $data | grep -oP '(?<=).*?(?= - 技術教學)' > title.txt

此指令碼使用curl命令檢索網頁的HTML內容,然後使用grep提取標題標籤並將其儲存到檔案中。

指令碼10:SSH自動化

一個自動化SSH登入和在遠端伺服器上執行命令的指令碼。這是一個使用sshpass命令的示例:

#!/bin/bash
server="example.com"
username="user"
password="password"
command="ls"
sshpass -p $password ssh $username@$server $command

此指令碼使用sshpass命令自動化SSH登入並在遠端伺服器上執行命令,無需使用者互動。

指令碼11:資料庫備份

一個執行MySQL資料庫備份並將它們上傳到遠端伺服器的指令碼。這是一個使用mysqldump命令和rsync命令的示例:

#!/bin/bash
db_name="mydb"
db_user="user"
db_password="password"
backup_dir="/path/to/backup/dir/"
backup_file="$backup_dir/backup_$(date +%Y-%m-%d_%H-%M-%S).sql"
mysqldump -u $db_user -p$db_password $db_name > $backup_file
rsync -avz $backup_dir user@example.com:/path/to/remote/dir/

此指令碼使用mysqldump命令執行MySQL資料庫的備份並將備份儲存到一個檔名中包含時間戳的檔案中。然後它使用rsync命令將備份檔案上傳到遠端伺服器。

結論

Shell指令碼是一個強大的工具,可以幫助您自動化任務、執行系統管理任務甚至建立軟體。我們在本文中介紹的指令碼只是shell指令碼的冰山一角,但它們應該為您構建自己的指令碼打下良好的基礎。

記住,熟能生巧,所以不要害怕嘗試不同的命令和指令碼,看看什麼最適合您。祝您指令碼編寫愉快!

更新於:2023年4月11日

462 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告