Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux test 指令實戰:條件判斷、檔案測試與 Shell 腳本邏輯控制

編輯:關於 Linux

test(或 [ ])是 Shell 腳本條件判斷的基石。本文系統整理檔案測試、字串比較、整數比較、邏輯運算與實戰模式,並釐清 test、[ ]、[[ ]]、(( )) 的差異。

基本語法與回傳值

test 條件表達式
# 等價
[ 條件表達式 ]      # POSIX 標準,需空格分隔

# 回傳值
$?  # 0 = true(成功),非 0 = false(失敗/錯誤碼)

檔案測試運算子(最常用)

運算子條件為真當...範例
-e FILE檔案存在test -e /etc/passwd
-f FILE一般檔案test -f /etc/passwd
-d FILE目錄test -d /home/user
-r FILE可讀test -r file.txt
-w FILE可寫test -w file.txt
-x FILE可執行test -x script.sh
-s FILE大小 > 0test -s log.txt
-L FILE符號連結test -L /usr/bin/python
-S FILESockettest -S /var/run/docker.sock
-p FILE命名管道test -p /tmp/fifo
-b FILE區塊裝置test -b /dev/sda
-c FILE字元裝置test -c /dev/tty
-g FILESGID 位test -g /usr/bin/sudo
-u FILESUID 位test -u /usr/bin/passwd
-k FILESticky 位test -k /tmp
-O FILE擁有者為當前用戶test -O myfile
-G FILE群組為當前用戶群組test -G myfile
-N FILE自上次讀取後被修改test -N ~/.bashrc
FILE1 -nt FILE2FILE1 比 FILE2 新test a.txt -nt b.txt
FILE1 -ot FILE2FILE1 比 FILE2 舊test a.txt -ot b.txt
FILE1 -ef FILE2同一 inode (硬連結/同檔)test a.txt -ef b.txt

字串比較

運算子說明備註
-z STRING長度為 0常用:test -z "$VAR"
-n STRING長度非 0預設行為,可省略 -n
STRING1 = STRING2相等單 =,POSIX 標準
STRING1 != STRING2不相等
STRING1 < STRING2字典序小於需轉義 \< 或用 [[ ]]
STRING1 > STRING2字典序大於需轉義 \> 或用 [[ ]]

整數比較

運算子說明
-eq等於
-ne不等於
-lt小於
-le小於等於
-gt大於
-ge大於等於

邏輯運算

運算子語法優先序
NOT! EXPR最高
ANDEXPR1 -a EXPR2中
OREXPR1 -o EXPR2最低
群組( EXPR )需轉義 \( \)

四大判斷結構差異總表

特性test / [ ][[ ]](( ))[[ 字串 ]]
標準POSIXBash/Zsh/Ksh 擴充Bash/Zsh/Ksh 算術Bash 擴充
字串比較= !== != == != =~ (regex)不支援== != =~
萬用字元不支援支援 (右邊不加引號)不支援支援
變數引用需雙引號可不加引號直接 $VAR 或 VAR可不加引號
整數比較-eq -lt...-eq -lt... 或 < > <= >=< > <= >= == !=-eq -lt...
邏輯運算-a -o !&& \|\| !&& \|\| !&& \|\| !
子shell否否否否

實戰模式

1. 檔案存在性檢查

if [ -e "$CONFIG_FILE" ]; then
    echo "配置檔存在"
else
    echo "配置檔缺失,使用預設值"
fi

2. 目錄不存在則建立

[ -d "$LOG_DIR" ] || mkdir -p "$LOG_DIR"

3. 多條件組合

# 檔案存在且可讀且非空
if [ -f "$FILE" -a -r "$FILE" -a -s "$FILE" ]; then
    process "$FILE"
fi

# Bash 推薦寫法
if [[ -f "$FILE" && -r "$FILE" && -s "$FILE" ]]; then
    process "$FILE"
fi

4. 整數運算與比較

COUNT=10
if (( COUNT > 5 )); then
    echo "大於 5"
fi

5. 字串模式比對

VERSION="1.2.3"
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo "語義化版本格式正確"
fi

常見錯誤避坑

  • [ -f $FILE ] → 變數未加引號,空值導致語法錯誤,永用 "$FILE"
  • [ $A = $B ] → 同理,必加雙引號
  • [ $A > $B ] → > 被解釋為重導向,必用 [[ $A > $B ]] 或 (( A > B ))
  • [ -f file -a -r file ] → -a 優先序低,複雜邏輯改用 [[ ]] + &&

熟練掌握 test 系列指令,是撰寫健壯 Shell 腳本的關鍵基礎。

Copyright © Windows教程網 All Rights Reserved