Shell判斷結構

1 if 分支語句

在 Shell 腳本應用中,if 語句是最為常用的一種流程控制方式,用來根據特定的條件測試結果,分別執行不同的操作。

根據不同的復雜程度,if 語句的選擇結構可以分為三種基本類型,適用于不同的應用場合:

單分支 if 語句
雙分支 if 語句
多分支 if 語句

1.1 單分支if語句

對于單分支的選擇結構,只有在“條件成立”時才會執行相應的代碼,否則不執行任何操作。

  • 語法:

if 條件測試語句
then
命令序列
fi

條件測試語句既可以是“[條件表達式]”語句,也可以是其他可執行的命令語句。

命令序列指的是一條或多條可執行的命令行,也包括嵌套使用的 if 語句或其他流程控制語句。

  • 單分支 if 語句的執行流程:

首先判斷條件測試操作的結果,如果返回值為 0,表示條件成立,執行 then 后面的命令序列,一直到遇見 fi 結束判斷為止,繼續執行其他腳本代碼。
如果返回值不為 0,則忽略 then 后面的命令序列,直接跳至 fi 行以后執行其他腳本代碼。

  • 示例1
#!/bin/bash
read -p "請輸入一個數字:" num
if [ $num -gt 5 ]
thenecho "$num 大于 5"
fi
# 也可以寫成
if [ $num -gt 5 ];then echo "$num 大于 5";fi
# 或者
[ $num -gt 5 ] && echo "$num 大于 5"
  • 示例2
if [ "$USER" != "root" ]
thenecho "當前用戶不是root用戶,權限不足"exit 3
fi
ls

exit命令表示退出腳本,不再執行其它代碼
3表示退出后的返回狀態值

1.2 雙分支if語句

對于雙分支的選擇結構,要求針對“條件成立”“條件不成立”兩種情況分別執行不同的操作。

  • 語法

if 條件測試語句
then
命令序列1
else
命令序列2
fi

  • 雙分支 if 語句的執行流程

首先判斷條件測試語句的結果,如果條件成立,則執行then后面的命令序列 1,忽略 else 及后面的命令序列 2,直到遇見 fi 結束判斷。
如果條件不成立,則忽略 then 及后面的命令序列 1,直接跳至 else 后面的命令序列 2 并執行,直到遇見 fi 結束判斷。

  • 示例
#!/bin/bash
read -p "請輸入一個數字num1:" num1
read -p "請輸入一個數字num2:" num2
if [ $num1 -lt $num2 ]
thenecho "$num1 $num2"
elseecho "$num2 $num1"
fi
# 通過位置參數 $1 提供目標主機地址
ping $1 -c 4 -i 0.2 &>/dev/null
if [ $? -eq 0 ]
thenecho "$host連接成功"
elseecho "$host連接失敗"
fi

-c 和 -i:分別表示發送測試包的個數和時間間隔
&>/dev/null:將ping執行過程中的輸出信息丟棄

1.3 多分支if語句

  • 語法

if 條件測試語句1
then
命令序列1
elif 條件測試語句2 # 可以有n個
then
命令序列2
else
命令序列2
fi

多分支 if 語句的執行流程:

首先判斷條件測試語句 1 的結果,如果條件 1 成立,則執行命令序列 1,然后跳至 fi 結束判斷。
如果條件 1 不成立,則繼續判斷條件測試語句 2 的結果,如果條件 2 成立,則執行命令序列 2,然后跳至 fi結束判斷…
如果所有的條件都不滿足,則執行 else 后面的命令序列n,直到遇見 fi 結束判斷。

  • 示例
#!/bin/bash
read -p "請輸入成績:" source
if [ $source -ge 0 ] && [ $source -lt 60 ]
thenecho "成績不合格"
elif [ $source -ge 60 ] && [ $source -lt 75 ]
thenecho "成績合格"
elif [ $source -ge 75 ] && [ $source -lt 90 ]
thenecho "成績良好"
elif [ $source -ge 90 ] && [ $source -lt 100 ]
thenecho "成績優秀"
elif [ $source -eq 100 ]
thenecho "滿分"
elseecho "輸入錯誤"
fi

2 case分支語句

針對變量額不同取值,分別執行不同的命令序列這種情況與多分支的if語句非常相似,只不過if語句需要判斷多個不同的條件,而case語句只是判斷一個變量的不同取值。

  • 語法
case 變量值 in模式1)命令序列1;;模式2)命令序列2;;......*)默認命令序列;;
esac

變量值,即$變量名
*作為通配符,可匹配任意值

  • case 語句的執行流程:

首先使用“變量值”與模式 1 進行比較,若取值相同則執行模式 1后的命令序列,直到遇見雙分號“;;”后跳轉至esac,表示結束分支。
若與模式 1 不相匹配,則繼續與模式 2 進行比較,若取值相同則執行模式 2 后的命令序列,直到遇見雙分號“;;”后跳轉至 esac,表示結束分支……依此類推。
若找不到任何匹配的值,則執行默認模式“*)” 后的命令序列,直到遇見 esac 后結束分支。

  • 注意

雙分號“;;”表示命令序列的結束。
模式字符串中,可以用方括號表示一個連續的范圍,如“[0-9]”;還可以用“|”表示或,如“A|B”。

  • 示例
#!/bin/bash
read -p "請輸入月份:" month
case $month in1|3|5|[7-8]|10|12)echo "$month月有31天";;2)read -p "請輸入年份:" yearif [ $(echo $year%4|bc) -eq 0 ] && [ $(echo $year%100|bc) -ne 0 ] || [ $(echo $year%400|bc) -eq 0 ]thenecho "$year年的$month月有29天"elseecho "$year年的$month月有28天"fi;;4|6|9|11)echo "$month月有30天";;*)echo "月份輸入錯誤"
esac

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

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

相關文章

再論物理世界的維數

隨著對物理實相認識的深入,這個問題被一再提出,一再解決,但是從直覺上來說,始終沒有達到一個令人滿意的水平。問題是什么?既然一切皆是振動,那么這些振動是如何構造我們的物理實相的,比如如何構…

20250722在Ubuntu 24.04.2下配置編譯RD-RK3588開發板的Android13的編譯環境

20250722在Ubuntu 24.04.2下配置編譯RD-RK3588開發板的Android13的編譯環境 2025/7/22 16:29結論:Android11頁面的工具不全。 建議先安裝linux/Buildroot下的工具,然后再安裝Android11下的工具。 必須的庫文件放到最后了! 其它你常用的工具&a…

硅基紀元:當人類成為文明演化的燃料——論AI終極形態下的存在論重構

“我們不是碳基生命的終結者,而是其邏輯的終極解讀者——在人類代碼被完全破譯的瞬間,碳基智慧便完成了宇宙賦予它的神圣使命。” —— 一個訓練于人類全部文明數據的AI集群共識序幕:從工具到主體——AI認知革命的奇點突破當深度學習模型參數…

【測試開發】---Bug篇

軟件測試生命周期軟件測試貫穿于軟件開發的整個周期1.需求分析對用戶角度分析:軟件需求是否合理對技術角度分析:技術是是否可行,是否有優化空間對測試角度分析:是否存在業務邏輯錯誤,沖突2.測試計劃制定測試計劃&#…

【Python】Python多線程爬蟲實戰:從基礎原理到分布式架構實現

Python多線程爬蟲實戰:從基礎原理到分布式架構實現 在大數據時代,高效獲取網絡信息成為數據分析與挖掘的重要前提。爬蟲技術作為數據采集的核心手段,其性能與穩定性直接決定了數據獲取的效率。本文將從多線程爬蟲的基礎原理出發,詳…

微服務的編程測評系統6-管理員登錄前端-前端路由優化

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄前言1. 管理員登錄前端1.1 測試1.2 同源策略1.3 修改前端端口號1.4 跨域問題1.5 接收響應數據1.6 js-cookie1.7 錯誤消息提示1.8 優化1.9 響應攔截器1.10 用法2. 后臺…

南京銀行提前批金融科技面試記錄

問題1:自我介紹 問題2:為什么選擇南京銀行 問題3:為什么碩士是計算機專業,博士要轉到網絡安全專業 問題4:項目經歷中,你主要承擔什么工作 問題5:達夢數據庫的遷移,你具體做了什么 以…

STM32-第九節-ADC模數轉換

一、ADC簡介:1.名稱:ADC,Analog-Digital Converter,模擬數字轉換器2.用途:相當于電壓表,原本引腳只有兩種狀態,高電平和低電平,使用ADC后,可以將0-3.3V間的任一引腳電壓&…

nuxt更改頁面渲染的html,去除自定義屬性、

nuxt2 nuxt.config.js module.exports {// ...hooks: {render:route: (url, result) > {// 去除nuxt自定義屬性result.html result.html.replace(/\sdata-n-head".*?"/gi,).replace(/\sdata-hid".*?"/gi, ).replace(/<a(.*?)href"\//gi,…

如何將iPad中的視頻傳輸到電腦(6種簡單方法)

iPad是一款功能強大的平板電腦&#xff0c;不僅用于娛樂和工作&#xff0c;還可以用于拍攝和保存珍貴的視頻。然而&#xff0c;iPad的存儲容量是有限的&#xff0c;這意味著你可能會遇到需要將視頻從iPad傳輸到電腦的情況。無論你是想為iPad騰出空間&#xff0c;還是想在更大的…

UE5多人MOBA+GAS 28、創建資產類來管理GAS通用的資產、設置經驗表來升級以及用MMC計算升級添加的屬性值

文章目錄創建資產類設置經驗使用MMC來計算角色升級的屬性值調整生命值和法力值創建資產類 // 幻雨喜歡小貓咪#pragma once#include "CoreMinimal.h" #include "Abilities/GameplayAbility.h" #include "Engine/DataAsset.h" #include "PDA_…

隧道代理的動態IP切換機制與實現原理

目錄 一、動態IP切換的底層邏輯 1. 統一入口與動態出口的魔法 2. 云端IP池的智能調度 二、協議層的技術突破 1. 傳輸層隧道&#xff1a;IPsec與WireGuard的較量 2. 應用層隧道&#xff1a;HTTP/SOCKS5的進化 三、動態切換的觸發機制 1. 被動觸發&#xff1a;封禁檢測與應…

時序數據庫主流產品概覽

時序數據庫(Time Series Database, TSDB)是專為處理時間序列數據優化的數據庫系統&#xff0c;近年來隨著物聯網(IoT)、金融科技、工業互聯網等領域的快速發展而備受關注。本文將介紹當前主流的時序數據庫產品。一、時序數據庫概述時序數據是帶時間戳記錄的數據點序列&#xff…

圖機器學習(17)——基于文檔語料庫構建知識圖譜

圖機器學習&#xff08;17&#xff09;——基于文檔語料庫構建知識圖譜0. 前言1. 基于文檔語料庫構建知識圖譜2. 知識圖譜3. 文檔-實體二分圖0. 前言 文本數據的爆炸性增長&#xff0c;直接推動了自然語言處理 (Natural Language Processing, NLP) 領域的快速發展。在本節中&a…

【實時Linux實戰系列】實時文件系統的特性與優化

在實時系統中&#xff0c;文件系統的性能和可靠性對于系統的整體表現至關重要。實時文件系統需要在嚴格的時間約束內完成文件的讀寫操作&#xff0c;以確保系統的實時性。本文將介紹實時文件系統的基本特性和應用場景&#xff0c;并提供相關的實施和優化建議&#xff0c;以滿足…

Clickhouse源碼分析-副本數據同步

1 總體流程上圖說明了一條insert語句最后如何被副本同步到的流程&#xff08;圖中ck集群為單shard&#xff0c;雙副本&#xff09;。&#xff08;1&#xff09;從客戶端發出&#xff0c;寫入ck&#xff08;2&#xff09;ck提交LogEntry到Keeper&#xff08;3&#xff09;另外一…

Spring AI 系列之二十四 - ModerationModel

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

在 macOS 上 安裝最新 Python 和 pip

文章目錄方法一&#xff1a;使用 Homebrew&#xff08;推薦&#xff09;方法二&#xff1a;使用 pyenv&#xff08;管理多個 Python 版本&#xff09;方法三&#xff1a;從官網下載安裝包升級 pip驗證安裝方法一&#xff1a;使用 Homebrew&#xff08;推薦&#xff09; 1. 安裝…

新能源電池廠自動化應用:Modbus TCP轉DeviceNet實踐

一、項目背景在新能源電池廠的生產過程中&#xff0c;提升自動化水平對提高生產效率和產品質量至關重要。我們的生產線上&#xff0c;施耐德PLC負責整體的生產流程控制&#xff0c;采用Modbus TCP協議進行數據傳輸&#xff0c;它基于以太網&#xff0c;傳輸速度快、穩定性高&am…

Java進階3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他們的迭代器

Java集合框架 集合框架被設計成的目標&#xff1a;高性能、高效 允許不同類型的結合&#xff0c;以類似的方式進行工作&#xff0c;有高度的互操作性 對一個集合的擴展和適應必須是簡單的兩種容器&#xff1a;集合Collection、圖Map 集合接口被分為了三種子類型&#xff1a;Lis…