Shell腳本中和||語法解析

https://www.cnblogs.com/liuyuelinfighting/p/16377705.html

在 Shell 腳本中,&&||邏輯操作符,用于根據前一個命令的退出狀態(成功或失敗)決定是否執行后續命令。這種語法稱為 命令鏈(Command Chaining)

語法解析

[ -d student.txt ] && echo yes || echo no
  1. [ -d student.txt ]

    • 這是一個條件測試命令,用于檢查 student.txt 是否是一個目錄-d 參數)。
    • 如果目錄存在,返回退出狀態 0(成功);否則返回非 0(失敗)。
  2. &&(邏輯與)

    • 僅當左側命令成功時(退出狀態為 0,才會執行右側的命令。
    • 示例:
      [ -d student.txt ] && echo yes
      
      若目錄存在,則執行 echo yes;若不存在,跳過 echo yes
  3. ||(邏輯或)

    • 僅當左側命令失敗時(退出狀態非 0,才會執行右側的命令。
    • 示例:
      [ -d student.txt ] || echo no
      
      若目錄不存在,則執行 echo no;若存在,跳過 echo no

組合效果

  • 目錄存在時
    [ -d student.txt ] 成功 → 執行 && 后的 echo yesecho yes 成功 → 跳過 || 后的 echo no
    輸出:yes

  • 目錄不存在時
    [ -d student.txt ] 失敗 → 跳過 && 后的 echo yes → 由于左側整體失敗,執行 || 后的 echo no
    輸出:no


等價于 if-else 語句

上述命令鏈等價于以下 if-else 結構:

if [ -d student.txt ]; thenecho yes
elseecho no
fi

注意事項

  1. &&|| 的優先級
    && 的優先級高于 ||,因此命令按以下分組執行:
    ( [ -d student.txt ] && echo yes ) || echo no

  2. 命令退出狀態是關鍵

    • 每個命令的退出狀態決定后續操作(0=成功,非0=失敗)。
    • 例如,若 echo yes 意外失敗(極罕見),也會觸發 || echo no

其他常見用法

# 1. 僅當命令成功時執行操作
rm file.txt && echo "刪除成功"# 2. 僅當命令失敗時執行操作
cp a.txt b.txt || echo "復制失敗"# 3. 復雜組合(注意括號分組)
make && ( echo "編譯成功"; ./app ) || echo "編譯失敗"

通過命令鏈可以簡潔地實現條件邏輯,但復雜的場景建議使用 if-else 增強可讀性。


在 Shell 腳本中,單層中括號 [ ] 和雙層中括號 [[ ]] 都是條件測試語法,但 [[ ]] 是 Bash 的增強版測試命令,提供了更強大、更安全的功能。以下是主要區別和優勢:


1. 避免變量擴展問題(更安全)

[[ ]] 會自動處理變量中的空格和特殊字符,不需要額外加引號:

file="my file.txt"# 單括號會報錯(解析成 [ -f my file.txt ])
[ -f $file ] && echo "Exists"   # ? 錯誤:too many arguments# 雙括號正確處理
[[ -f $file ]] && echo "Exists" # ? 正確

2. 支持高級模式匹配

[[ ]] 支持通配符擴展和正則表達式:

# 通配符匹配(* 匹配任意字符)
[[ "hello.jpg" == *.jpg ]] && echo "JPEG file"  # ? 輸出# 正則表達式匹配(=~ 操作符)
[[ "hello123" =~ ^[a-z]+[0-9]+$ ]] && echo "Valid ID"  # ? 輸出

3. 更直觀的邏輯運算符

可直接使用 &&/|| 代替 -a/-o

# 單括號(必須用 -a/-o)
[ -f file.txt -a -r file.txt ] && echo "Readable file"# 雙括號(可直接用 &&/||)
[[ -f file.txt && -r file.txt ]] && echo "Readable file"  # ? 更直觀

4. 支持字符串比較運算符

字符串比較時不需要轉義:

# 單括號需轉義 >(否則被識別為重定向)
[ "apple" \> "banana" ] && echo "True"# 雙括號無需轉義
[[ "apple" > "banana" ]] && echo "True"  # ? 更簡潔

5. 防止路徑名擴展

[[ ]] 不會展開通配符(如 *):

# 當前目錄有 a.txt, b.txt
[ "*.txt" == *.txt ] && echo "Equal"   # ? 實際比較 "*.txt" == "a.txt b.txt"
[[ "*.txt" == *.txt ]] && echo "Equal" # ? 正確比較字符串(輸出 Equal)

6. 增強的數值比較

支持更自然的數值比較語法:

num=10
[[ num -gt 5 ]] && echo "大于 5"     # ? 傳統寫法
(( num > 5 )) && echo "大于 5"       # ? 推薦數值比較寫法(雙括號專用于算術)

何時使用?

場景建議語法
需要兼容 /bin/sh[ ] (POSIX)
Bash 腳本(推薦)[[ ]]
數值比較(( ))

經典示例對比

# 檢查文件是否存在且可讀(兼容 POSIX)
[ -f "my file.txt" -a -r "my file.txt" ] && echo "OK"# Bash 推薦寫法(更安全簡潔)
[[ -f my\ file.txt && -r my\ file.txt ]] && echo "OK"

💡 總結:在 Bash 腳本中優先使用 [[ ]],它能避免許多常見陷阱,提供更強大的模式匹配能力,同時代碼更簡潔直觀。但若需兼容 POSIX Shell(如 dash),則需使用 [ ]

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

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

相關文章

MySQL中的常見運算符

精選專欄鏈接 🔗 MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱,點贊+關注,每日精進1%,共攀技術高峰 更多內容持續更新中!希望能給大家帶來幫助~ &…

高級IO技術詳解:阻塞/非阻塞IO、多路復用與內存映射

高級IO技術詳解:阻塞/非阻塞IO、多路復用與內存映射 關鍵詞:阻塞IO 非阻塞IO select/poll/epoll mmap 一、阻塞IO vs 非阻塞IO 類型行為特點設置方式阻塞IO- 讀空管道阻塞- 寫滿管道阻塞默認模式非阻塞IO- 讀空文件返回 -1,errnoEAGAIN- 寫滿…

【無標題】拓撲對偶框架的嚴格性補完與哲學突破

拓撲對偶框架的嚴格性補完與哲學突破: 一、數學嚴格性補完:同調類守恒的解決方案 1.1 負系數問題的幾何化修正 **問題本質**:當 $a_i$ 含負數時,曲率分配 $\kappa\frac{2\pi a_i}{A_{\text{max}}}$ 導致偽黎曼流形 **解決方案…

從0開始學習R語言--Day25--A/B測試 vs 多臂老虎機

通常在比較兩個不同的方案對數據的影響時,我們會各拿50%的數據去進行對照試驗,這樣觀測到的結果會最大程度地保留統計學上的特點。但實際上,并不是所有對比不同方案都要這樣做,一來,我們需要等到兩組實驗都完全結束后&…

功耗高?加密弱?愛普特APT32F1023H8S6單片機 2μA待機+AES硬件加密破局

愛普特APT32F1023H8S6單片機深度解析 1. 產品定位 APT32F1023H8S6 是愛普特半導體(APT)推出的 32位高性能單片機,基于 ARM Cortex-M0內核,主打 高集成度、低功耗、高性價比,面向消費電子、工業控制和物聯網領域。 2. …

【MFC】繪制自定義控件-顯示圖片(支持放大操作)

目錄 一、CDC類(二級緩存)二、計算視口三、放大操作代碼中初始化操作(方便以后cv) 一、CDC類(二級緩存) CDC類是設備上下文的核心類,它的作用是抽象化對圖形輸出設備(像屏幕、打印機…

在Proteus新工程中放置基本元器件

視頻教程: [最詳細]Proteus新建第一個工程與快捷鍵設置 操作步驟 1選擇這個黃色的三角,然后點擊旁邊的P,開始找元件。 2點開P后,呈現如下圖界面,我們在Keyword欄中,輸入stm32,然后他會自動出現對應的元件&…

PRUD幣推動健康數據資產化,開啟Web3隱私金融新時代

在全球健康科技與數據主權浪潮下,PRUD幣(Prudential Utility & Data Token)正成為Web3健康金融領域中的重要通證。項目通過鏈上身份綁定、健康行為證明、隱私計算與NFT機制,為用戶打造了“健康數據資產化”的創新路徑&#xf…

Mac 安裝 finalshell

1.下載 地址:FinalShell官網 第一個進入選擇對應的 mac 版本下載。 下一步下一步完成安裝。 2.鏈接虛擬機,點擊圖示文件夾 點擊新建鏈接,新建 SSH 鏈接 3.去 vmware 中查詢 Linux 系統的 IP,使用 ip addr 命令或者 ifconfig 命令皆可。 ip…

Javaweb - 2 HTML

目錄 HTML 入門 1. HTML & CSS & JavaScript 的作用 2. 什么是 HTML 3. 什么是超文本 4. 什么是標記語言 5. HTML 基本結構 6. HTML 概念詞匯解釋 7. HTML 的一些語法規則 8. 開發工具 VsCode 安裝插件: 常見設置: HTML 常見標簽 …

CWGAN-GP 增強型 CAE 在非 IID 數據集中用于 5G-NR 干擾檢測

抽象 在不斷擴大的 5G-NR 無線蜂窩網絡領域中,無線干擾攻擊作為安全攻擊普遍存在,損害了接收信號的質量。我們通過將加性高斯白噪聲 (AWGN) 合并到真實世界的同相和正交 (I/Q) OFDM 數據集中來模擬干擾環境…

JavaEE-Spring-Web-Mvc

Spring Web MVC 是基于 Servlet API 構建的原始 Web 框架,從?開始就包含在 Spring 框架中。它的正式名稱“Spring Web MVC”來?其源模塊的名稱(Spring-webmvc),但它通常被稱為"Spring MVC". Servlet 是?種實現動態??的技術. 準確來講Serv…

Linux從入門到入門

系統教程學習類 Ubuntu 從入門到精通 系統頁面/基本操作類 Ubuntu20.04終端固定終端到左邊的導航欄_ubuntu20.04設置菜單固定-CSDN博客Ubuntu 20.04 系統5分鐘后老是自動鎖屏_修改鎖屏時間-CSDN博客 命令類 拷貝:將 下載 文件夾里的.sh文件 復制到opt目錄下 sudo cp…

AI自動生成Git提交信息-git AI Commit

在現代軟件開發中,編寫清晰且一致的Git提交信息對于維護項目歷史和促進團隊協作至關重要。然而,為每次變更手動撰寫描述性提交信息可能耗時,尤其是處理復雜差異或大型項目時。AI Commit 是一個利用AI分析Git差異并生成符合Conventional Commi…

【三大前端語言之一】樣式:CSS詳解

【三大前端語言之一】樣式:CSS詳解 在了解完HTML的有關知識后,我們應該知道,一個網頁光有框架還不行,必須還得有裝飾它的樣式。就好比房子的結構搭好了,但如果沒有油漆、沒有窗簾、沒有家具,就無法真正展現…

Spring AI 聊天記憶功能實戰(一):從接口設計到生產實踐

Spring AI 聊天記憶功能實戰(一):從接口設計到生產實踐 在構建AI對話應用時,聊天記憶管理及存儲是實現連貫上下文交互的關鍵組件。而大模型(LLM)本質上是無狀態的,這意味著它們不會保留歷史交互…

Element Plus 對話框 el-dialog 和 抽屜 el-drawer 的使用注意項(使用 div 包裹)

總結:使用 div 包裹!!! 詳細說明: 對話框 el-dialog 或 抽屜 el-drawer 樣式的設置說明: 要想有效設置 el-dialog 或 el-drawer 的樣式,需確保 el-dialog 或 el-drawer 的上層不是template&am…

【python】簡單演示 gateway、service、client的工作原理

gateway 看起來主要是做協議轉換的A gateway is a network node that acts as an entrance and exit point, connecting two networks that use different protocols. It allows data to flow between these networks, essentially acting as a translator between different c…

數據倉庫面試題合集⑥

實時指標體系設計 + Flink 優化實戰:面試高頻問題 + 項目答題模板 面試中不僅會問“你做過實時處理嗎?”,更會追問:“實時指標體系是怎么搭建的?”、“你們的 Flink 穩定性怎么保證?” 本篇聚焦實時指標體系設計與 Flink 優化場景,幫你答出架構設計力,也答出調優實戰感…

Vue + AbortController 請求取消彈窗 hook 封裝

背景 實際業務開發場景中,往往存在有些大數據請求的需求,一旦請求發起加載遮罩后用戶就無法操作了,直接尬住,所以提供一個支持取消查詢的功能還是很有必要的,為了在全業務接口都能使用封裝一個hook。 ?為什么要用 A…