Day 4:Shell流程控制——從“直線思維“到“智能決策“的進化

目錄

    • 一、if語句:你以為簡單其實暗藏殺機
      • 1. 基礎語法(看似簡單卻容易踩坑)
      • 2. 安全寫法規范(企業級建議)
    • 二、條件測試的六大門派
      • 1. 文件測試(運維最愛)
      • 2. 字符串比較(引號是靈魂)
      • 3. 數字比較(別再用>了!)
    • 三、case語句:比if更優雅的多路分支
      • 1. 基礎用法(菜單系統必備)
      • 2. 高級模式匹配(支持通配符)
    • 四、實戰:智能文件處理器
    • 五、避坑指南:生產環境經驗
      • 1.總是檢查返回值:
      • 2.防御性編程:
      • 3.避免過度嵌套:
    • 六、性能優化技巧
      • 1. 條件順序優化
      • 2. 使用case代替多層if
    • 課后挑戰:智能日志分析器

開篇:當你的腳本需要做選擇

想象你在教機器人泡咖啡:

  • 直線腳本:只會按固定步驟操作(燙傷顧客預警!)
  • 智能腳本:能判斷"如果糖不夠,就提醒補貨"、“當水溫>90℃時停止加熱”

今天我們要把這種決策能力賦予Shell腳本,讓你告別"一根筋"式編程!

一、if語句:你以為簡單其實暗藏殺機

1. 基礎語法(看似簡單卻容易踩坑)

if [ 條件 ]; then命令
elif [ 條件 ]; then命令
else命令
fi

經典錯誤案例:

# 錯誤1:忘記then
if [ -f file.txt ]echo "存在"  # 會報錯# 錯誤2:多余分號
if [ -d dir ]; then;  # 多了一個分號echo "存在"
fi

2. 安全寫法規范(企業級建議)

# 推薦風格:then換行,條件加空格
if [[ -f "/etc/passwd" ]]
thenecho "關鍵文件存在"
fi

二、條件測試的六大門派

1. 文件測試(運維最愛)

[ -e "/path" ]    # 存在即可(文件/目錄都行)
[ -S "/tmp/mysql.sock" ]  # 是否是socket文件
[ -N "/etc/hosts" ]  # 文件是否被修改過

2. 字符串比較(引號是靈魂)

name=""
[ -z "$name" ] && echo "姓名為空"  # 判斷空字符串
[ -n "$PATH" ] || echo "PATH居然為空?"  # 判斷非空

3. 數字比較(別再用>了!)

[ 10 -gt 5 ]  # 大于
[ $? -eq 0 ]  # 判斷上條命令是否成功
[ $RANDOM -lt 10000 ] && echo "幸運數字"

三、case語句:比if更優雅的多路分支

1. 基礎用法(菜單系統必備)

read -p "輸入命令(start|stop|restart): " cmd
case "$cmd" instart)echo "服務啟動中...";;stop)echo "服務停止中...";;*)echo "無效命令!"exit 1;;
esac

2. 高級模式匹配(支持通配符)

case "$HOSTNAME" innode[1-9])echo "這是集群節點";;db-*)echo "這是數據庫服務器";;
esac

四、實戰:智能文件處理器

   #!/bin/bash
# 根據文件類型自動處理file="$1"if [[ ! -e "$file" ]]; thenecho "錯誤:文件不存在" >&2exit 1
ficase $(file -b "$file") in*"ASCII text"*)echo "文本文件 - 顯示前5行:"head -n 5 "$file";;*"Zip archive"*)echo "壓縮包 - 查看內容:"unzip -l "$file" | head -10;;*"PDF"*)echo "PDF文件 - 提取文本:"pdftotext "$file" - | head -n 10;;*)echo "未知文件類型";;
esac

運行效果:

$ ./file_proc.sh test.pdf
PDF文件 - 提取文本:
Chapter 1
Introduction to Shell...

五、避坑指南:生產環境經驗

1.總是檢查返回值:

if ! cp file1 file2; thenecho "復制失敗!" >&2exit 1
fi

2.防御性編程:

dir="/data/logs"
[ -d "$dir" ] || mkdir -p "$dir" || exit 1

3.避免過度嵌套:

# 不好:
if [ 條件1 ]; thenif [ 條件2 ]; then...fi
fi# 更好:
[ 條件1 ] && [ 條件2 ] && 命令

六、性能優化技巧

1. 條件順序優化

# 把高概率條件放前面
if [[ $RANDOM -lt 1000 ]]; thenecho "小概率事件"
elif [[ $RANDOM -gt 10000 ]]; thenecho "常見情況"
fi

2. 使用case代替多層if

# 測試速度差異(case通常更快)
time {for i in {1..1000}; docase "$i" in1) ;; 2) ;; ...esacdone
}

課后挑戰:智能日志分析器

需求:

  • ? 分析/var/log/syslog(或其他日志)
  • ? 根據關鍵詞(ERROR/WARNING等)統計出現次數
  • ? 用不同顏色輸出不同級別日志

進階要求:

  • ?? 當日志文件過大時(>100MB)自動啟用less查看

示例輸出:

$ ./log_analyzer.sh
ERROR  : 15(顯示紅色)
WARNING: 28(顯示黃色)

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

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

相關文章

分布式訓練中的隨機種子策略:深入理解與實踐指南

分布式訓練中的隨機種子策略:深入理解與實踐指南 引言:一個容易被忽視的關鍵細節 在深度學習的分布式訓練中,你是否見過這樣的代碼? torch.manual_seed(process_seed) # PyTorch操作 random.seed(process_seed) # Pyth…

金山辦公發布WPS智慧教育平臺,發力教育AI意義何在?

鈦媒體消息,金山辦公發布面向教育用戶的 WPS 智慧教育平臺,面對著金山辦公的發力,我們該怎么分析呢? 首先,從市場拓展與用戶需求響應角度看,金山辦公此次推出WPS智慧教育平臺,直接瞄準了教育領…

無人機航電系統之語音通信技術篇

無人機航電系統的語音通信技術是確保無人機與地面控制站、其他無人機或相關人員之間實現高效、穩定語音交互的關鍵技術,在軍事偵察、應急救援、物流運輸、航拍測繪等眾多領域發揮著至關重要的作用。 一、技術原理 無人機航電系統的語音通信技術主要基于無線通信原理…

element plus 的樹形控件,如何根據后臺返回的節點key數組,獲取節點key對應的node節點

在使用 Element Plus 的 el-tree 組件時,如果后端返回的節點 key 數組中包含了部分選中的父級節點的 key,可能會導致該父級節點下的所有子節點也被默認選中。這是因為 el-tree 的默認行為是:如果一個父節點被選中,那么其所有子節點…

什么是Sentinel

什么是 Sentinel? 在分布式系統中,服務間的依賴關系錯綜復雜。一個服務的故障,很可能像多米諾骨牌一樣,迅速蔓延并導致整個系統崩潰,這就是我們常說的“雪崩效應”。為了避免這種災難性后果,我們需要一種強大的機制來保護我們的系統,而 Sentinel 正是為此而生。 Senti…

AWS 使用圖形化界面創建 EKS 集群(零基礎教程)

無需命令行!通過 AWS 控制臺圖形化操作,輕松創建 Kubernetes 集群。 文章目錄 文章簡介 一、準備工作:登錄 AWS 控制臺 二、創建 EKS 集群(控制面) 1. 創建 EKS 集群 2. 設置集群基本信息 3. 配置網絡設置 三、添加…

[C#] Winform - 進程間通信(SendMessage篇)

一、發送端 // 窗體:發送端 public partial class SendForm : Form {public SendForm(){InitializeComponent();}// 按鈕:發送private void btnSend_Click(object sender, System.EventArgs e){IntPtr hwnd User32Helper.FindWindow(null, "接收端…

鋰電池保護板測試儀:守護電池安全的幕后保障

在電動汽車、儲能電站和便攜式電子設備中,鋰電池作為核心動力源,其能量密度與安全性始終是行業關注的焦點。鋰電池在過充、過放、短路等異常情況下可能引發起火甚至爆炸,而鋰電池保護板正是解決這一問題的關鍵組件。為確保保護板性能可靠&…

Qemu搭建RISC-V,運行opensbi+u-boot+img

?1.先下載一個Ubuntu鏡像 https://cdimage.ubuntu.com/releases/24.04/release/ 我這里下載的是這個RISC-V的 🌟1.2.解壓鏡像 xz -d ubuntu-24.04.2-preinstalled-server-riscv64.img.xz ?2.準備RISC-V的QEMU 打開qemu官網https://www.qemu.org/&#xff0c…

【實戰手冊】銀河麒麟服務器系統進入單用戶模式修改密碼(root)指南

目錄 前言 一、銀河麒麟單用戶模式簡介 二、進入單用戶模式修改密碼 三、登錄驗證新密碼 結語 前言 在日常服務器運維工作中,忘記root密碼是系統管理員偶爾會遇到的問題。作為國產操作系統的優秀代表,銀河麒麟服務器系統提供了通過單用戶模式重置r…

偏微分方程通解求解2

題目 求下列方程的通解: { u x y = u x u y u ? 1 ; u x y = u x u y ; u x y = u x u y u u 2 + 1 ; \begin{cases} u_{xy} = u_x u_y u^{-1}; \\ u_{xy} = u_x u_y; \\ u_{xy} = \dfrac{u_x u_y u}{u^2 + 1}; \end{cases} ????????uxy?=ux?uy?u?1;uxy?=ux?…

用于算法性能預測的 GNN 框架

大家讀完覺得有幫助記得關注和點贊!!! 抽象。 數值黑盒優化中的自動算法性能預測通常依賴于問題特征,例如探索性景觀分析特征。這些特征通常用作機器學習模型的輸入,并以表格格式表示。然而,這種方法往往忽…

拯救海量數據:PostgreSQL分區表性能優化實戰手冊(附壓測對比)

1 分區表核心原理與生產痛點 物理存儲結構決定性能邊界 PostgreSQL分區表的本質是繼承表路由規則的邏輯封裝。當父表被查詢時,查詢優化器通過CHECK約束快速定位子表,其性能核心取決于: -- 關鍵系統視圖 SELECT relname, relkind, relpages …

【Wi-Fi天氣時鐘】網絡授時

文章目錄 1 網絡授時概述1.1 什么是網絡授時1.2 為什么要使用網絡授時2 API概述2.1 什么是API2.2 如何使用API3 淘寶時間API簡介4 網絡授時流程和AT指令5 網絡授時程序設計5.1 API返回信息解析5.2 RTC初始化5.3 必要的后續操作6 結語1 網絡授時概述 1.1 什么是網絡授時 首先我…

騰訊云IM即時通訊:開啟實時通信新時代

一、引言 在當今數字化浪潮席卷全球的時代,即時通訊已然成為互聯網世界中不可或缺的關鍵元素。無論是個人日常生活中的社交互動,還是企業運營里的高效協作,即時通訊都發揮著舉足輕重的作用,已然滲透到人們生活與工作的每一個角落…

js邏輯:【增量更新機制】

增量更新機制:在數據發生變化時,只對變化的部分進行更新的策略,而不是每次都重新處理全部數據,即:在數據發生變化時,只對變化的部分進行更新的策略,而不是每次都重新處理全部數據 watch: {base…

詳解Redis的LUA腳本、管道 (Pipelining)、事務事務 (Transactions)

1. 管道 (Pipelining) 網絡延遲 (Round-Trip Time - RTT) 瓶頸。 在傳統模式下,客戶端發送一個命令 -> 等待 Redis 服務器處理并返回結果 -> 再發送下一個命令。如果客戶端需要執行大量命令(例如設置或獲取多個鍵),每個命令…

SIP 協議中的定時器

SIP(Session Initiation Protocol) 是一種信令協議,廣泛用于建立、維持和終止多媒體會話(如VoIP通話)。作為基于UDP等不可靠傳輸的協議,SIP 通過多個定時器機制來確保消息的可靠傳輸和狀態機的正常運行。 …

【機器學習深度學習】偏置項(Bias)概念

目錄 前言 一、先說結論:偏置項是“默認起點” 二、類比理解 類比 1:老師給學生的“基礎分” 類比 2:預測房價時的“固定成本” 三、沒有偏置項的模型,會有什么問題? 四、在神經網絡中,偏置項是神經…

使用數組 海選女主角

問題描述 面試那天,剛好來了m * n個MM,站成一個m * n的隊列,副導演Fe(OH)2為每個MM打了分數,分數都是32位有符號整數。 一開始我很納悶:分數怎么還有負的?Fe(OH)2解釋說,根據選拔規則&#xff…