CASE 语句

Bash 脚本入门

Alex Scriven

Data Scientist

为何需要 CASE 语句

当存在多个或复杂条件时,CASE 比 IF 更高效。

假设要测试以下条件与操作:

  • 若文件包含 sydney,则移到目录 /sydney
  • 若文件包含 melbournebrisbane,则删除
  • 若文件包含 canberra,则重命名为 IMPORTANT_filename,其中 filename 为原文件名
Bash 脚本入门

一个复杂的 IF 语句

也可以像这样写多个 IF:

  • 此代码对第一个 ARGV 参数执行 grep 作为条件判断。
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • 看起来复杂且重复,对吧?
Bash 脚本入门

构建 CASE 语句

  • 先选择要匹配的变量或字符串
    • 这里也可调用"壳中壳"!
  • 添加任意多的匹配与操作
    • PATTERN 可用正则。如 Air* 表示"以 Air 开头",*hat* 表示"包含 hat"。
  • 注意用右括号分隔模式与要运行的代码,命令以双分号结束

CASE 基本格式:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Bash 脚本入门

构建 CASE 语句

  • *) DEFAULT COMMAND;;

    • 常见做法(非必需):最后给出默认命令,在无匹配时执行。
  • esac 最后一行是 esac

    • 这是把"case"反过来拼写!

CASE 基本格式:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Bash 脚本入门

从 IF 到 CASE

我们之前的 IF 语句:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

我们的新 CASE 语句:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Bash 脚本入门

Passons à la pratique !

Bash 脚本入门

Preparing Video For Download...