条件测试操作
在Shell编程中,条件语句(如if、elif、else)用于基于某个条件的结果来执行不同的代码块。为了测试这些条件,Shell提供了多种条件测试操作。
以下是Shell编程中常用的条件测试操作:
测试字符串
-z STRING:如果STRING的长度为零,则为真。
-n STRING 或 STRING:如果STRING的长度非零,则为真。
STRING1 = STRING2 或 STRING1 == STRING2:如果两个字符串相同,则为真。
STRING1 != STRING2:如果两个字符串不同,则为真。
测试整数
-eq:等于。
-ne:不等于。
-gt:大于。
-ge:大于或等于。
-lt:小于。
-le:小于或等于。
例如:if [ $a -eq $b ]
文件测试
-e FILE:如果文件存在,则为真。
-f FILE:如果文件是一个普通文件(不是目录或设备文件),则为真。
-s FILE:如果文件大小非零,则为真。
-d FILE:如果文件是一个目录,则为真。
-r FILE:如果文件可读,则为真。
-w FILE:如果文件可写,则为真。
-x FILE:如果文件可执行,则为真。
-L FILE 或 -h FILE:如果文件是一个符号链接,则为真。
例如:if [ -e /path/to/file ]
复合条件测试
! EXPRESSION:如果EXPRESSION为假,则为真。
EXPRESSION1 -a EXPRESSION2 或 EXPRESSION1 && EXPRESSION2:两个表达式都为真时,结果为真。
EXPRESSION1 -o EXPRESSION2 或 EXPRESSION1 || EXPRESSION2:两个表达式中至少有一个为真时,结果为真。
注意:在[ ]中的表达式两边应有空格,否则可能会出错。另外,-a和-o在某些shell(如bash)中可能不被推荐,而建议使用&&和||来进行逻辑与和逻辑或操作。
示例:
bash复制代码#!/bin/bash a=5 b=10 if [ $a -lt $b ]; then echo "a is less than b" elif [ $a -eq $b ]; then echo "a is equal to b" else echo "a is greater than b" fi if [ -e /path/to/file ]; then echo "File exists" else echo "File does not exist" fi
if 条件语句
在Shell编程中,if 条件语句用于基于某个条件的结果来执行相应的代码块。如果条件为真(即返回值为0),则执行then后面的代码块;如果条件为假(即返回值非0),则可以选择性地执行else或elif(即“else if”)后面的代码块。
以下是一个if条件语句的基本结构:
bash复制代码if [ CONDITION ] then # 如果条件为真时执行的代码 else # 如果条件为假时执行的代码 fi
或者,如果你有多个条件要检查,可以使用elif:
bash复制代码if [ CONDITION1 ] then # 如果条件1为真时执行的代码 elif [ CONDITION2 ] then # 如果条件1为假但条件2为真时执行的代码 else # 如果所有条件都为假时执行的代码 fi
在[ ]中,你可以使用上面提到的各种测试条件,如字符串测试、整数测试、文件测试等。记住,在[ ]内部的两边都需要有空格,这是Shell语法的要求。
以下是一些示例:
示例 1:检查两个整数的大小
bash复制代码#!/bin/bash a=5 b=10 if [ $a -lt $b ] then echo "$a is less than $b" elif [ $a -eq $b ] then echo "$a is equal to $b" else echo "$a is greater than $b" fi
示例 2:检查文件是否存在
bash复制代码#!/bin/bash FILE="/path/to/some/file.txt" if [ -e "$FILE" ] then echo "File $FILE exists" else echo "File $FILE does not exist" fi
注意在示例2中,我使用了双引号来包围变量$FILE。这是一个好习惯,因为它可以防止文件名中包含空格或特殊字符时导致的问题。
另外,你还可以使用(( ))来进行算术比较,这是bash特有的语法,它不需要在比较运算符前后加空格:
示例 3:使用(( ))进行算术比较
bash复制代码#!/bin/bash a=5 b=10 if (( a < b )) then echo "$a is less than $b" fi
case 分支语
在Shell编程中,case语句用于多路分支,它允许根据一个变量的值来执行不同的代码块。case语句在结构上类似于其他编程语言中的switch语句。
以下是case语句的基本语法:
bash复制代码case VARIABLE in PATTERN1) # 如果VARIABLE的值匹配PATTERN1,则执行这里的代码 ;; PATTERN2) # 如果VARIABLE的值匹配PATTERN2,则执行这里的代码 ;; # ... 可以有更多的模式 *) # 如果VARIABLE的值不匹配任何模式,则执行这里的代码(默认情况) ;; esac
注意以下几点:
每个模式后面都需要用)闭合。
每个模式匹配的代码块后面需要用;;来终止。
*是一个通配符,用于匹配任何值(类似于其他编程语言中的default)。
以下是一个case语句的示例:
bash复制代码#!/bin/bash # 假设我们有一个变量day,它包含了星期几的名字 day="Monday" case $day in Monday) echo "Today is Monday." ;; Tuesday|Wednesday|Thursday|Friday) echo "Today is a weekday." ;; Saturday|Sunday) echo "Today is a weekend." ;; *) echo "Invalid day: $day" ;; esac
在这个示例中,我们根据变量day的值来输出不同的消息。如果day是"Monday",则输出"Today is Monday.";如果day是"Tuesday"、"Wednesday"、"Thursday"或"Friday"中的任何一个,则输出"Today is a weekday.";如果day是"Saturday"或"Sunday",则输出"Today is a weekend.";如果day的值不匹配任何模式,则输出"Invalid day: $day"。