文章目錄
- 前言
- 一、命令擴展詳解
- 1.1 邏輯運算符
- 1.1.1 邏輯與運算符(&&)
- 1.1.2 邏輯或運算符(||)
- 1.1.3 組合使用注意事項
- 1.2 echo 命令
- 1.2.1 基本用法
- 1.2.2 輸出到標準錯誤(stderr)
- 1.3 標準文件描述符(FD)
- 1.3.1 文件描述符說明
- 1.3.2 示例演示
- 1.4 重定向操作
- 1.4.1 覆蓋重定向(>)
- 1.4.2 追加重定向(>>)
- 1.4.3 錯誤輸出重定向(2> / 2>>)
- 1.5 同時重定向 stdout 與 stderr
- 1.5.1 POSIX 推薦寫法
- 1.5.2 Bash 簡寫形式
- 1.6 丟棄輸出:/dev/null
- 1.6.1 丟棄 stdout
- 1.6.2 丟棄 stderr
- 1.6.3 同時丟棄 stdout 和 stderr
- 1.7 管道(|)與重定向的區別
- 1.7.1 基本用法
- 1.7.2 包含 stderr 的管道
- 1.8 高級技巧:自定義文件描述符
- 1.8.1 打開與寫入自定義 FD
- 1.9 小結與備忘
- 二、流程控制之if條件語句
- 2.1 流程控制概述
- 2.2 if 格式1:單支
- 2.3 if 格式2:雙支
- 2.4 if 格式3:多支
- 總結
前言
Shell 秘典,乃 Linux/Unix 修仙界中執掌自動化運維、料理日常要務的無上法門。此秘典內蘊的號令組合之玄妙、流程掌控之神通,猶如修仙者手中的本命法寶,能大幅提升修士在系統界域內的管理修為,助其輕松應對各類繁雜事務。?
本文決意深入拆解 Shell 秘典中的號令延展秘術 —— 諸如邏輯運化符、重定向術、管道通玄術等,更會詳解流程掌控心法?if 天機判語篇。行文之間,將輔以海量修仙實例與真實界域應用場景,如同修仙大能親授秘籍,引領諸位修士洞悉 Shell 秘典的核心符文與編程神通。?
無論你是初入 Linux/Unix 修仙界、剛觸摸修行門檻的萌新修士,還是渴望夯實基礎、突破修為瓶頸的中級行者,這篇修仙指南都將為你奉上清晰明了、實用至極的修行指引,助你在 Shell 秘典的修行之路上暢通無阻,早日修成運維大道,成為一方系統界域的掌控者。
一、命令擴展詳解
1.1 邏輯運算符
1.1.1 邏輯與運算符(&&)
含義:
僅當左側命令執行成功(即退出狀態碼為 0)時,才執行右側的命令。
示例:
false && echo "成功"
# 無輸出,因為 `false` 失敗(退出碼非0),右側命令不執行true && echo "成功"
成功
# true 成功(退出碼為0),因此執行 echo 命令
1.1.2 邏輯或運算符(||)
含義:
僅當左側命令執行失敗(即退出狀態碼非 0)時,才執行右側的命令。
示例:
false || echo "左側失敗,執行此處"
左側失敗,執行此處true || echo "不會執行"
# 無輸出,因為 true 成功,右側命令不執行
1.1.3 組合使用注意事項
說明:
A && B || C
從左到右結合,等價于 (A && B) || C
。
示例:
false && echo yes || echo fallback
fallback
# 因為 (false && echo yes) 不成立,于是執行 || 后面的 echo fallback
1.2 echo 命令
1.2.1 基本用法
含義:
將文本內容輸出到標準輸出(stdout,文件描述符為 1)。
示例:
echo "hello world"
hello world
1.2.2 輸出到標準錯誤(stderr)
方法:
使用重定向 >&2
將文本發送到標準錯誤(stderr,文件描述符為 2)。
示例:
echo "this is error" >&2
# 文本將輸出到 stderr
1.3 標準文件描述符(FD)
1.3.1 文件描述符說明
0
:stdin(標準輸入)1
:stdout(標準輸出)2
:stderr(標準錯誤)
1.3.2 示例演示
分別輸出到 stdout 和 stderr:
echo "out"
out # 輸出到 stdoutecho "err" >&2
err # 輸出到 stderr
只重定向 stdout,stderr 仍顯示在終端:
ls /no/such/path >out.txt
# 終端顯示錯誤信息(stderr),out.txt 為空或不存在
1.4 重定向操作
- > 把 stdout 寫到文件(覆蓋原內容)
- >> 把 stdout 追加到文件末尾
1.4.1 覆蓋重定向(>)
含義:
將 stdout 寫入文件,若文件已存在則覆蓋原有內容。
示例:
echo "first" > file.txt
echo "second" > file.txt
cat file.txt
second
1.4.2 追加重定向(>>)
含義:
將 stdout 追加到文件末尾,不覆蓋原有內容。
示例:
echo "first" > file.txt
echo "second" >> file.txt
cat file.txt
first
second
1.4.3 錯誤輸出重定向(2> / 2>>)
含義:
將 stderr(文件描述符 2)重定向到文件,支持覆蓋或追加。
示例(覆蓋):
ls /no/such/path 2>err.txt
cat err.txt
ls: cannot access '/no/such/path': No such file or directory
示例(追加):
ls /no/such/path 2>>err.txt
1.5 同時重定向 stdout 與 stderr
1.5.1 POSIX 推薦寫法
格式:
command >out.txt 2>&1
含義:
先將 stdout 重定向到文件,再將 stderr 重定向到當前 stdout 指向的位置(即out.txt文件)。
示例:
bash -c 'echo out; echo err >&2' >both.txt 2>&1
cat both.txt
out
err
注意順序:
以下寫法會導致 stderr 仍輸出到終端:
bash -c 'echo out; echo err >&2' 2>&1 >both.txt
這條會把 stderr 重定向到 最初的 stdout(終端),然后再把 stdout 重定向到文件,結果是:錯誤仍打印到終端,而文件里只有 stdout 內容。
1.5.2 Bash 簡寫形式
格式:
command &>file
或 command |& other
說明:
&>
:將 stdout 和 stderr 都寫入文件(Bash 特性)|&
:將 stdout 和 stderr 都送入管道(Bash/Zsh 特性)
示例:
bash -c 'echo out; echo err >&2' &> both.txt
cat both.txt
out
err
1.6 丟棄輸出:/dev/null
1.6.1 丟棄 stdout
含義:把不想要的輸出重定向到 /dev/null (黑洞)。
示例:只保留 stderr,丟棄 stdout:
方法:
some_command > /dev/null
1.6.2 丟棄 stderr
方法:
some_command 2> /dev/null
1.6.3 同時丟棄 stdout 和 stderr
方法(POSIX):
some_command > /dev/null 2>&1
方法(Bash 簡寫):
some_command &> /dev/null
1.7 管道(|)與重定向的區別
含義:把前一個命令的 stdout 作為下一個命令的 stdin。默認只傳輸 stdout,不包含 stderr(除非你把stderr 重定向到 stdout)。
1.7.1 基本用法
含義:
將前一個命令的 stdout 作為下一個命令的 stdin。默認不包含 stderr。
示例:
echo -e "apple\nbanana" | grep banana
banana
1.7.2 包含 stderr 的管道
方法:
command 2>&1 | grep something
# 或使用 Bash 簡寫:
command |& grep something
示例:
# sed -n 'P' 等價于 cat
bash -c 'echo out; echo err >&2' 2>&1 | sed -n 'p'
out
err
1.8 高級技巧:自定義文件描述符
1.8.1 打開與寫入自定義 FD
方法:
使用 exec
打開一個新的文件描述符,并寫入內容。
示例:
exec 3>mylog.txt # 將文件描述符 3 重定向到文件mylog.txt
echo "hello" >&3 # 將 "hello" 寫入到文件描述符 3 關聯的文件(即 mylog.txt)
exec 3>&- # 釋放文件描述符 3 的資源,確保文件被正確關閉
cat mylog.txt
hello
說明:
該技巧常用于腳本中管理多個日志流或輸出通道。
1.9 小結與備忘
&&
:左側成功才執行右側||
:左側失敗才執行右側>
:覆蓋 stdout,>>
:追加 stdout2>
和2>>
:用于重定向 stderr- 將 stderr 重定向到 stdout:
2>&1
(注意順序) - 同時重定向 stdout 和 stderr:
- POSIX:
>file 2>&1
- Bash:
&>file
- POSIX:
- 丟棄輸出:
/dev/null
,可配合2>/dev/null
或&>/dev/null
- 管道
|
默認只傳輸 stdout;需傳輸兩者時使用2>&1 |
或|&
(Bash)
二、流程控制之if條件語句
2.1 流程控制概述
任何程序都有默認的執行流程,通常是從上向下
逐行依次執行。
#!/bin/bash #先執行的第1行
num=100 #第2行
((num++)) #第3行
echo $num #第4行
.........
要控制程序的默認執行流程,可以使用流程控制語句:
- 選擇結構:選擇性執行特定代碼段
- 循環結構:重復執行代碼段,直到滿足終止條件(通過條件控制循環次數)
Shell提供了多種判斷方式,支持對數字、字符串和文件的操作。
2.2 if 格式1:單支
if [ 條件 ]; then
命令…
fi
執行機制:判斷一次,僅有一個結果
- 條件成立(true):執行命令
- 條件失敗(false):沒有任何執行
示例:
#!/bin/bash
num1=$1 #第一個參數賦值給num1
num2=$2
if [ $num1 -gt $num2 ]; thenecho "$num1 大于 $num2"
fi## 執行shell程序
./ifdemo.sh 10 5
案例1:ls /mnt 如果執行成功,輸出 it’s OK
#!/bin/bash
if ls /mnt # ls /mnt執行成功,輸出 it's OK
thenecho " it's OK"
fi
2.3 if 格式2:雙支
if [ 條件 ]; then
命令1…
else
命令2…
fi
執行機制:判斷一次條件,有兩個不同結果
- 條件成立(true):執行 then 后面的代碼(命令1)
- 條件失敗(false):執行 else 后面的代碼(命令2)
示例:
#!/bin/bash
num1=$1 #第一個參數賦值給num1
num2=$2
if [ $num1 -qt $num2 ]; thenecho "$num1 大于 $num2"
elseecho "$num1 小于 $num2"
fi
分別執行./ifdemo.sh 10 5
和./ifdemo.sh 5 10
查看結果:
./ifdemo.sh 10 5
./ifdemo.sh 5 10
案例1:判斷當前登錄用戶是不是管理員
#!/bin/bash
if [ $UID -eq 0 ]; thenecho "當前用戶是管理員"
elseecho "當前用戶是普通用戶"
fi
案例2:判斷目錄是否存在
#!/bin/bash
read -p "檢查目錄是否存在, 請輸入目錄:" aa
if ls $aa > /dev/null
thenecho "目錄存在"
elseecho "請輸入正確路徑"
fi
案例3:校驗httpd服務是否啟動
#!/bin/bash
if netstat -antulp| grep ":80" &> /dev/null; thenecho "web網站服務已經運行了!"
elseecho "啟動httpd服務"if rpm -q httpd &> /dev/null; thenecho "httpd服務已安裝,啟動httpd服務"systemctl restart httpdelseecho "httpd服務未安裝,開始下載httpd服務"yum install -y httpd > /dev/nullsystemctl restart httpdfiecho "httpd服務已啟動!"
fi
案例4:校驗ip是否可以ping通
#!/bin/bash
#ip=$1
read -p "請輸入IP:" ip
#-c 次數 -i ping一次多少秒 -W 反饋結果的時間
ping -c 2 -i 0.2 -W 3 $ip &> /dev/nullif [ $? -eq 0 ];thenecho "$ip is up "
elseecho "$ip is down"
fi
2.4 if 格式3:多支
if [ 條件1 ]; then
命令1…
elif [ 條件2 ]; then
命令2
......elif
else
默認命令…
fi
執行機制:系統會依次檢查多個判斷條件,一旦某個條件成立,則執行對應的操作并終止后續判斷;若所有條件均不滿足,則執行默認操作。
例如,若第1個條件成立,則僅執行命令1,跳過其余條件判斷。
示例:
#!/bin/bash
read -p "請輸入您的分數" score
if [ $score -ge 90 ]; thenecho "優秀" # 分數>=90 優秀
elif [ $score -ge 80 ]; thenecho "良好" # 80<=分數<90 良好
elif [ $score -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi# 執行腳本
./ifdemo.sh
案例1:判斷用戶輸入數字是奇數還是偶數
#!/bin/bash
read -p "請輸入一個整數" num
if [ $[num % 2] -eq 0 ]; thenecho "$num 是偶數"
elseecho "$num 是奇數"
fi
案例2:用戶輸入兩個數,判斷大小
#!/bin/bash
read -p "請輸入第一個整數" num1
read -p "請輸入第二個整數" num2
if [ $num1 -gt $num2 ];thenecho "$num1 > $num2"
elif [ $num1 -lt $num2 ];thenecho "$num1 < $num2"
elseecho "$num1 = $num2"
fi
案例3:判斷文件類型 d f b
#!/bin/bash
read -p "輸入一個文件名:" filename
if [ -z $filename ] || [ ! -e $filename ]; thenecho "文件不存在"
elif [ -f $filename ]; thenecho "$filename 是普通文件"
elif [ -d $filename ]; thenecho "$filename 是目錄"
elif [ -b $filename ]; thenecho "$filename 是塊設備文件"
elseecho "母雞呀"
fi
案例4:根據時間判斷時間段
#!/bin/bash
#1、定義時間變量
a=$(date +%H)
#2、定義時間段 早上
if [ $a -ge 6 -a $a -lt 11 ];thenecho "現在時間是早上$a點"
#3、定義時間段 中午
elif [ $a -ge 11 -a $a -lt 13 ];thenecho "現在時間是中午$a點"
#4、定義時間段 下午
elif [ $a -ge 13 -a $a -lt 18 ];thenecho "現在時間是下午$a點"
#5、定時間段 晚上
elif [ $a -ge 18 -a $a -lt 24 ];thenecho "現在時間是晚上$a點"
else echo "現在時間是凌晨 $a 點"
f
總結
本文以修仙傳承之法,系統拆解 Shell 秘典兩大核心修行要訣:其一為號令延展秘術(命令擴展),可助修士靈活運化界域指令,如御萬千法符組百變神通;其二是流程掌控心法?if 天機判語篇(流程控制之 if 條件語句),能勘破事務邏輯,依情境決斷應對之策,乃執掌系統界域的根基。
二者相輔相成,構 Shell 修仙法門核心骨架。唯有融會貫通此兩大要訣,方能在 Linux/Unix 界域修行中筑牢道基,為后續探尋高深運維通天術法鋪路。
在號令延展秘術(命令擴展)部分,我們詳細講解了:
- 邏輯運算符
&&
和||
的使用場景與執行機制; echo
命令的輸出控制與重定向技巧;- 標準文件描述符(stdin、stdout、stderr)的作用與重定向方法;
- 如何同時處理 stdout 和 stderr,以及如何丟棄不必要的輸出;
- 管道與重定向的區別與聯合使用;
- 高級技巧如自定義文件描述符的打開與關閉。
在流程掌控心法?if 天機判語篇部分,我們重點剖析了 if 條件語句的三種結構:
- 單支結構:條件成立時執行特定命令;
- 雙支結構:根據條件成立與否分別執行不同命令;
- 多支結構:依次判斷多個條件,執行第一個成立的條件對應的命令。
通過多場修仙實戰歷練 —— 諸如靈脈服務狀態勘驗(服務狀態檢查)、界域網絡通玄測試(網絡連通性測試)、寶器文件品類辨識(文件類型判斷)等,吾等將展演 if 天機判語在系統界域執掌中的典型妙用,助力諸位修士洞悉其運轉玄機,習得煉制穩固腳本秘寶的神通。
?
悟透這些基礎符文奧義與編程玄功,非但能提升腳本秘寶的煉制效率,更可增強秘寶的穩固性與可修繕性,為后續修習更繁復的自動化通天術法筑牢根基,助你在 Linux/Unix 修仙界的修行之路更上一層樓,早日具備執掌復雜系統界域的大能。