Shell編程核心入門:參數傳遞、運算符與流程控制全解析

Shell編程核心入門:參數傳遞、運算符與流程控制全解析

在Linux/Unix系統中,Shell作為命令解釋器和腳本語言,是自動化運維、批量處理任務的核心工具。掌握Shell腳本的參數傳遞運算符使用流程控制,能讓你從“手動執行命令”升級為“編寫腳本自動完成復雜任務”。本文將結合實例,詳細拆解這三大核心知識點,助你快速入門Shell編程。

文章目錄

  • Shell編程核心入門:參數傳遞、運算符與流程控制全解析
    • 一、Shell參數傳遞:讓腳本更靈活
      • 1.1 基礎:參數傳遞與獲取方式
        • 傳遞參數的語法
        • 腳本內獲取參數的語法
      • 1.2 關鍵區別:$* vs $@
        • 實例驗證
      • 2.2 關系運算符:判斷數值大小
        • 實例:比較兩個參數大小
      • 2.3 邏輯運算符:組合條件判斷
        • 實例:判斷數值是否在指定范圍
      • 2.4 文件測試運算符:判斷文件屬性
        • 實例:檢查腳本是否可執行
    • 三、Shell流程控制:控制腳本執行邏輯
      • 3.1 選擇結構:根據條件執行不同代碼
        • 1. if語句:單支、雙支、多支判斷
        • 實例:根據分數判斷等級
        • 2. case語句:多值匹配判斷
        • 實例:簡單菜單交互
    • 四、綜合實例:Shell腳本實戰
    • 五、總結

一、Shell參數傳遞:讓腳本更靈活

在執行Shell腳本時,我們可以通過命令行向腳本傳遞參數,實現“同一腳本處理不同數據”的需求。比如編寫一個計算兩個數之和的腳本,通過參數傳入不同數字,無需修改腳本即可得到結果。

1.1 基礎:參數傳遞與獲取方式

傳遞參數的語法

執行腳本時,參數緊跟在腳本名后,用空格分隔

./腳本名 參數1 參數2 參數3 ...

例如:./calc.sh 10 20 表示向calc.sh腳本傳遞參數1020

腳本內獲取參數的語法

腳本中通過$n獲取第n個參數(n為數字),特殊變量用于獲取參數整體信息:

變量含義示例(以上述./calc.sh 10 20為例)
$0當前腳本的文件名$0 輸出 ./calc.sh
$1~$n第1個到第n個參數$1 輸出 10$2 輸出 20
$#傳遞的參數總數$# 輸出 2
$*所有參數的集合(作為一個整體字符串)"$*" 輸出 "10 20"
$@所有參數的集合(作為獨立參數列表)"$@" 輸出 "10" "20"

1.2 關鍵區別:$* vs $@

$*$@都表示“所有參數”,但被雙引號包裹時行為完全不同,這是Shell參數傳遞的高頻考點:

場景$*的行為$@的行為
不被""包裹均以$1 $2 ... $n形式輸出參數列表均以$1 $2 ... $n形式輸出參數列表
""包裹合并為一個字符串:"$1 $2 ... $n"保持獨立參數:"$1" "$2" ... "$n"
實例驗證

創建param_demo.sh腳本:

#!/bin/bash
echo "=== \$* 演示 ==="
for arg in "$*"; doecho "參數:$arg"
doneecho "=== \$@ 演示 ==="
for arg in "$@"; doecho "參數:$arg"
done

執行腳本:./param_demo.sh 1 2 3,輸出結果:

=== $* 演示 ===
參數:1 2 3
=== $@ 演示 ===
參數:1
參數:2
參數:3

結論:循環處理獨立參數時,優先使用"$@";需將所有參數作為整體字符串處理時,使用"$*"

## 二、Shell運算符:實現腳本的計算與判斷
Shell本身不支持直接數學運算,需通過工具(如`expr`)或特殊語法(如`$(( ))`)實現。運算符按功能分為**算術運算符**、**關系運算符**、**邏輯運算符**和**文件測試運算符**。### 2.1 算術運算符:處理數值計算
常用算術運算符:`+`(加)、`-`(減)、`*`(乘)、`/`(除)、`%`(取余)、`++`(自增)、`--`(自減)。#### 實現方式對比
| 方式         | 語法示例                          | 說明                                  |
|--------------|-----------------------------------|---------------------------------------|
| `expr`       | `val=`expr 2 + 2``                | 運算符兩邊必須有空格,用反引號``包裹  |
| `$(( ))`     | `val=$((2+2))`                    | 支持運算符無空格,語法簡潔            |
| `$[ ]`       | `val=$[2+2]`                      | 與`$(( ))`類似,兼容性稍差            |
| `let`        | `let val=2+2`                     | 直接計算,無需`$`引用變量            |#### 實例:計算1-10的累加和
```bash
#!/bin/bash
sum=0
for ((i=1; i<=10; i++)); dosum=$((sum + i))  # 或 sum=$[sum+i]
done
echo "1-10累加和:$sum"  # 輸出 55

2.2 關系運算符:判斷數值大小

關系運算符僅支持整數,返回true(0)或false(非0),常用于條件判斷。

運算符含義示例(a=10b=20
-eq等于[ $a -eq $b ] → false
-ne不等于[ $a -ne $b ] → true
-gt大于[ $a -gt $b ] → false
-lt小于[ $a -lt $b ] → true
-ge大于等于[ $a -ge $b ] → false
-le小于等于[ $a -le $b ] → true
實例:比較兩個參數大小
#!/bin/bash
a=$1
b=$2
if [ $a -gt $b ]; thenecho "$a > $b"
elif [ $a -lt $b ]; thenecho "$a < $b"
elseecho "$a == $b"
fi

執行:./compare.sh 15 20 → 輸出 15 < 20

2.3 邏輯運算符:組合條件判斷

用于將多個條件組合,常見有兩種語法(注意場景區別):

邏輯關系if語句中語法直接計算語法示例(a=10
與(and)-a&&[ $a -gt 5 -a $a -lt 15 ] → true
或(or)-o`
非(not)!![ ! $a -eq 5 ] → true
實例:判斷數值是否在指定范圍
#!/bin/bash
num=$1
if [ $num -ge 0 -a $num -le 100 ]; thenecho "$num 在 0-100 范圍內"
elseecho "$num 超出范圍"
fi

2.4 文件測試運算符:判斷文件屬性

Shell腳本常需操作文件(如判斷文件是否存在、是否可執行),文件測試運算符是核心工具:

運算符含義示例
-e文件/目錄是否存在[ -e ./test.sh ]
-f是否為普通文件[ -f ./test.sh ]
-d是否為目錄[ -d ./test_dir ]
-r是否可讀[ -r ./test.sh ]
-w是否可寫[ -w ./test.sh ]
-x是否可執行[ -x ./test.sh ]
-s文件是否非空(大小>0)[ -s ./test.sh ]
實例:檢查腳本是否可執行
#!/bin/bash
file="./test.sh"
if [ -e $file ]; thenif [ -x $file ]; thenecho "$file 可執行,開始運行..."./$fileelseecho "$file 不可執行,添加執行權限..."chmod +x $filefi
elseecho "$file 不存在!"
fi

三、Shell流程控制:控制腳本執行邏輯

默認情況下,Shell腳本按“從上到下、逐行執行”的順序運行。流程控制語句可改變執行順序,分為選擇結構(if、case)和循環結構(for、while)。

3.1 選擇結構:根據條件執行不同代碼

1. if語句:單支、雙支、多支判斷
  • 單支if:條件成立則執行,否則不執行;

    if [ 條件 ]; then代碼塊
    fi
    
  • 雙支if:條件成立執行代碼1,否則執行代碼2;

    if [ 條件 ]; then代碼塊1
    else代碼塊2
    fi
    
  • 多支if:多條件判斷,匹配第一個成立的條件;

    if [ 條件1 ]; then代碼塊1
    elif [ 條件2 ]; then代碼塊2
    else默認代碼塊
    fi
    
實例:根據分數判斷等級
#!/bin/bash
score=$1
if [ $score -ge 90 ]; thenecho "優秀"
elif [ $score -ge 80 ]; thenecho "良好"
elif [ $score -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi

執行:./grade.sh 85 → 輸出 良好

2. case語句:多值匹配判斷

當需要匹配“固定的多個值”時(如菜單選擇),caseif-elif更簡潔,語法如下:

case $變量 in模式1)代碼塊1;;  # 結束當前模式模式2)代碼塊2;;*)  # 默認模式(無匹配時執行)默認代碼塊;;
esac  # case的反寫,標志結束
實例:簡單菜單交互
#!/bin/bash
echo "請選擇操作:1.查看日期 2.查看目錄 3.退出"
read choice  # 讀取用戶輸入
case $choice in1)date;;2)ls;;3)echo "退出程序"exit 0  # 退出腳本;;*)echo "無效選擇";;
esac

四、綜合實例:Shell腳本實戰

結合上述知識點,編寫一個“批量文件重命名”腳本:需求是將當前目錄下所有.txt文件重命名為file_1.txtfile_2.txt

#!/bin/bash
# 批量重命名.txt文件
count=1  # 計數器,用于文件名編號# 遍歷當前目錄下的.txt文件
for file in *.txt; do# 判斷是否為普通文件(避免目錄干擾)if [ -f $file ]; then# 重命名文件mv $file "file_$count.txt"echo "已重命名:$file → file_$count.txt"count=$((count + 1))  # 計數器自增fi
doneecho "重命名完成,共處理 $((count-1)) 個文件"

五、總結

Shell編程的核心是“通過參數傳遞實現靈活性、通過運算符實現計算判斷、通過流程控制實現邏輯跳轉”。掌握本文的三大知識點后,你可以:

  1. 編寫支持命令行參數的腳本;
  2. 實現數值計算、文件判斷等核心功能;
  3. 用流程控制語句處理復雜邏輯(如批量任務、交互菜單)。

建議從“小腳本”開始練習(如文件備份、日志清理),逐步積累實戰經驗,最終實現Shell自動化運維的目標!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95162.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用 Kotlin 在 Android 手機開發一個應用程序獲取網絡時間

使用 NTP 協議獲取網絡時間在 build.gradle 文件中添加以下依賴&#xff1a;implementation commons-net:commons-net:3.6創建 NTP 時間獲取工具類&#xff1a;import org.apache.commons.net.ntp.NTPUDPClient import org.apache.commons.net.ntp.TimeInfo import java.net.In…

python智慧交通數據分析可視化系統 車流實時檢測分析 深度學習 車流量實時檢測跟蹤 軌跡跟蹤 畢業設計?

博主介紹&#xff1a;?全網粉絲50W&#xff0c;前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室&#xff0c;專注于計算機相關專業項目實戰6年之久&#xff0c;累計開發項目作品上萬套。憑借豐富的經驗與專業實力&#xff0c;已幫助成千上萬的學生順利畢業&#xff0c;…

計算機視覺第一課opencv(四)保姆級教學

目錄 簡介 一、輪廓檢測 1.查找輪廓的API 2.代碼分析 2.1.圖像二值化處理 2.2輪廓檢測 2.3輪廓繪制 2.4輪廓面積計算 2.5輪廓周長計算 2.6篩選特定面積的輪廓 2.7查找最大面積的輪廓 2.8繪制輪廓的外接圓 2.9繪制輪廓的外接矩形 二、輪廓的近似 三、模板匹配 簡…

基于Vue2+elementUi實現樹形 橫向 合并 table不規則表格

1、實現效果 共N行&#xff0c;但是每一列對應的單元格列數固定&#xff0c;行數不固定2、實現方式說明&#xff1a;使用的是vue2 elementUI表格組件 js實現<template><div class"table-container" ><el-table height"100%" :span-metho…

深度學習在計算機視覺中的應用:對象檢測

引言 對象檢測是計算機視覺領域中的一項基礎任務&#xff0c;目標是在圖像或視頻幀中識別和定位感興趣的對象。隨著深度學習技術的發展&#xff0c;對象檢測的準確性和效率都有了顯著提升。本文將詳細介紹如何使用深度學習進行對象檢測&#xff0c;并提供一個實踐案例。 環境準…

node.js 安裝步驟

在Node.js中安裝包通常通過npm(Node Package Manager)來完成,這是Node.js的包管理工具。以下是安裝Node.js和通過npm安裝包的基本步驟: 1. 安裝Node.js 方法一:使用nvm(Node Version Manager) 推薦使用nvm來安裝Node.js,因為它允許你安裝多個Node.js版本,并輕松地在…

面試-故障案例解析

一、NFS故障&#xff0c;造成系統cpu使用率低而負載極高。故障概述: 公司使用NFS為web節點提供共享存儲服務,某一天下午發現web節點CPU使用率低,而負載極高.登錄web節點服務器排查發現后段NFS服務器故障. 影響范圍: 網站看不到圖片了。 處理流程: 通過ssh登錄NFS服務…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(一)

摘要: 隨著高通量測序、醫學影像和電子病歷等生物醫學數據的爆炸式增長,對高效、可靠、可擴展的計算工具需求日益迫切。Go語言憑借其原生并發模型、卓越的性能、簡潔的語法和強大的標準庫,在生物醫學信息學領域展現出獨特優勢。本文以“生物醫學Go編程探析”為主題,通過三個…

針對 “TCP 連接建立階段” 的攻擊

針對 “TCP 連接建立階段” 的攻擊一、定義二、共性防御思路三、攻擊手段3.1、SYN 洪水攻擊&#xff08;SYN Flood&#xff09;3.2、Land 攻擊&#xff08;Land Attack&#xff09;一、定義 什么是針對 “TCP 連接建立階段” 的攻擊&#xff1f;核心特征是利用 TCP “三次握手…

聊一聊 單體分布式 和 微服務分布式

微服務 與 單體架構對比維度單體架構微服務架構??架構本質??一個單一的、功能齊全的應用程序一組??小型、獨立??的服務集合??開發??團隊工作在同一個代碼庫&#xff0c;易產生沖突。技術棧統一。每個服務可以由?? 獨立的小團隊 ??負責&#xff0c;允許使用??…

【C++八股文】計算機網絡篇

網絡協議核心知識點詳解 TCP頭部結構 TCP頭部包含多個關鍵字段&#xff0c;每個字段都有其特定作用&#xff1a; 16位源端口&#xff1a;標識發送方應用程序的端口號16位目的端口&#xff1a;標識接收方應用程序的端口號32位序號&#xff1a;保證數據包有序傳輸的唯一標識32…

小迪Web自用筆記7

游戲一般不走http https協議&#xff0c;一般的抓包工具抓不到。科來&#xff0c;這個工具是從網卡抓包。你一旦打怪數據就會多起來↓但不是很專業。可以抓到https。wep↑這個西東是全部協議都做流量包&#xff0c;你不知道他是從哪兒來的&#xff0c;他全都抓&#xff08;專業…

現代 Linux 發行版為何忽略Shell腳本的SUID位?

在現代Linux系統中&#xff0c;為Shell腳本設置 SUID&#xff08;Set User ID&#xff09; 權限位幾乎是無效的。這個看似簡單的現象背后&#xff0c;是Linux內核設計者們在安全與便利性之間做出的一個至關重要的歷史性抉擇。要徹底理解這一點&#xff0c;我們需要深入到內核層…

Qt節點編輯器設計與實現:動態編輯與任務流可視化(一)

文章目錄一、項目概述二、整體架構&#xff1a;模型-視圖分離的設計哲學1. 模型層&#xff1a;數據與業務邏輯的核心2. 視圖層&#xff1a;圖形渲染與用戶交互3. 交互層&#xff1a;連接模型與視圖的橋梁三、核心模塊解析1. 樣式管理系統&#xff1a;視覺表現的基石2. 圖形數據…

MySQL常見報錯分析及解決方案總結(4)---ERROR 1040(00000):Too many connections

報錯信息&#xff1a;ERROR 1040(00000):Too many comnections異常效果&#xff1a;原因分析&#xff1a;“ERROR 1040 (00000): Too many connections” 是 MySQL 數據庫最常見的連接數超限錯誤&#xff0c;本質是 “當前試圖連接數據庫的客戶端數量&#xff0c;超過了 MySQL …

GRPO(組相對策略優化):大模型強化學習的高效進化

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; ? 1. GRPO概述&#xff1a;重新定義大模型強化學習效率 GRPO&#x…

【Canvas與戳記】藍底黃面十六角Premium Quality戳記

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>藍底黃面十六角Premium Quality戳記 Draft1</title><style ty…

深度學習:洞察發展趨勢,展望未來藍圖

在科技飛速發展的當下&#xff0c;深度學習作為人工智能領域的璀璨明星&#xff0c;正以前所未有的速度重塑著各個行業的格局。從日常使用的智能語音助手&#xff0c;到醫療領域精準的疾病診斷&#xff0c;再到自動駕駛汽車對復雜路況的實時感知與決策&#xff0c;深度學習無處…

基于Docker部署的Teable應用

簡介Teable 是一款高性能多維表格本地化的解決方案&#xff0c;通過無代碼方式快速構建業務管理系統&#xff0c;支持私有部署和精細權限管理。對于個人或者小團隊使用&#xff0c;可以避免昂貴的集成軟件帶來的成本壓力。特點Excel 式任意拖拽選區編輯支持雙向關聯&#xff0c…

Java項目實現【記錄系統操作日志】功能

? 哈嘍&#xff0c;屏幕前的每一位開發者朋友&#xff0c;你們好呀&#xff01;?? 當你點開這篇文章時&#xff0c;或許正對著 IDE 里閃爍的光標發呆&#xff0c;或許剛解決一個卡了三天的 bug&#xff0c;正端著咖啡松口氣 —— 不管此刻的你在經歷什么&#xff0c;都想先和…