条件测试语句和if流程控制语句的使用
1、read命令
read 是一个在Unix/Linux shell中用于从用户输入读取数据的命令。它允许您在脚本中接收用户的键盘输入,并将输入存储到变量中,以便后续处理。以下是一些 read 命令的示例用法:
-
读取用户输入:
echo "What's your name?" read name echo "Hello, $name!"在这个例子中,
read name会等待用户输入,并将输入存储到名为name的变量中。然后,脚本会输出欢迎消息,包括用户输入的名字。 -
读取多个值:
echo "Enter your age and city:" read age city echo "You are $age years old and live in $city."在这个例子中,
read age city会等待用户输入两个值,分别存储到age和city变量中。 -
设置提示符:
read -p "Enter a number: " number echo "You entered: $number"使用
-p选项可以设置一个提示符,让用户知道他们需要输入什么类型的数据。 -
隐藏输入:
read -s -p "Enter your password: " password echo "Password entered."使用
-s选项可以隐藏用户的输入,适用于输入密码等敏感信息。 -
超时处理:
read -t 5 -p "Enter something (5 seconds timeout): " input if [ -z "$input" ]; then #-z "$input" 表示检查变量 $input 是否为空,如果为空则返回真(即条件成立),否则返回假(条件不成立)。 echo "Timeout!" else echo "You entered: $input" fi
使用 -t 选项可以设置超时时间,如果用户在指定时间内没有输入,脚本会做相应处理。
6.读取的输入分割成数组
input="apple banana cherry"
IFS=" " read -ra fruits <<< "$input"
read 命令通常用于与用户进行交互,接收输入并执行相应的操作。它是编写交互式脚本的重要工具。
2、if 流程控制语句
在Unix/Linux shell中,if 是一种流程控制语句,用于根据条件执行不同的代码块。以下是 if 语句的一般语法:
if [ condition ]; then
# Code to be executed if the condition is true
fi
if [ condition ]; then
# Code to be executed if the condition is true
else
# Code to be executed if the condition is false
fi
if [ condition ]; then
# Code to be executed if the condition is true
elif
# Code to be executed if the condition is true
else
# Code to be executed if the condition is false
fi
其中,关键要点如下:
-
if后面紧跟一个条件测试,通常使用方括号[ ... ]或test命令来执行条件判断。条件的结果要么为真(非零),要么为假(零)。 -
then关键字标志着条件成立时要执行的代码块的开始。 -
else关键字标志着条件不成立时要执行的代码块的开始。 -
fi表示if语句的结束。
以下是一个使用 if 语句的示例:
#!/bin/bash
read -p "Enter a number: " number
if [ "$number" -gt 10 ]; then
echo "The number is greater than 10."
else
echo "The number is not greater than 10."
fi
在这个示例中,用户输入一个数字,然后根据输入的数字大小执行不同的代码块。
此外,还可以使用 elif 关键字来添加更多的条件分支,构建更复杂的条件逻辑:
#!/bin/bash
read -p "Enter a number: " number
if [ "$number" -gt 10 ]; then
echo "The number is greater than 10."
elif [ "$number" -eq 10 ]; then
echo "The number is equal to 10."
else
echo "The number is less than 10."
fi
这允许您根据不同的情况执行不同的代码块。总之,if 语句是在shell脚本中实现条件控制流的重要工具。
3、test命令
test 命令通常用于条件测试,它判断给定的条件是否成立,并根据条件的真假返回相应的退出码。在许多 Unix-like 操作系统中,test 命令也可以使用方括号 [ ] 来表示,因为方括号实际上是 test 命令的一个别名。
以下是一些常用的 test 命令和参数:
-
数值比较:
-
-eq:等于(equal) -
-ne:不等于(not equal) -
-gt:大于(greater than) -
-lt:小于(less than) -
-ge:大于等于(greater than or equal to) -
-le:小于等于(less than or equal to)
-
-
字符串比较:
-
=:等于(equal) -
!=:不等于(not equal) -
-z:长度为零(空字符串) -
-n:长度非零(非空字符串)
-
-
文件检查:
-
-e:文件或目录存在(存在) -
-f:普通文件存在(存在且是普通文件) -
-d:目录存在(存在且是目录) -
-r:可读(有读取权限) -
-w:可写(有写入权限) -
-x:可执行(有执行权限) -
-b:块文件(存在) -
-c:字符型特殊文件(存在)
-
-
逻辑操作:
-
!:逻辑非(取反) -
-a:逻辑与(and) -
-o:逻辑或(or)
比较选项 描述 示例 -eq相等(整数比较) if [ "$a" -eq "$b" ]-ne不相等(整数比较) if [ "$a" -ne "$b" ]-gt大于(整数比较) if [ "$a" -gt "$b" ]-lt小于(整数比较) if [ "$a" -lt "$b" ]-ge大于等于(整数比较) if [ "$a" -ge "$b" ]-le小于等于(整数比较) if [ "$a" -le "$b" ]=字符串相等比较 if [ "$str1" = "$str2" ]!=字符串不相等比较 if [ "$str1" != "$str2" ]-z字符串为空(长度为0)比较 if [ -z "$str" ]-n字符串非空(长度大于0)比较 if [ -n "$str" ]-e文件存在比较 if [ -e "$file" ]-f文件为常规文件比较 if [ -f "$file" ]-d文件为目录比较 if [ -d "$dir" ]-r文件可读比较 if [ -r "$file" ]-w文件可写比较 if [ -w "$file" ]-x文件可执行比较 if [ -x "$file" ] -
下面是一些示例用法:
# 数值比较
if [ $num -eq 10 ]; then
echo "num 等于 10"
fi
# 字符串比较
if [ "$str" = "hello" ]; then
echo "str 等于 hello"
fi
# 文件检查
if [ -e /path/to/file ]; then
echo "文件存在"
fi
# 逻辑操作
if [ $num -lt 5 -o "$str" = "world" ]; then
echo "num 小于 5 或者 str 等于 world"
fi
这只是 test 命令的一些常见用法示例。你可以在终端中输入 man test 或者 help test 以获取更详细的文档和用法说明。
例:判断用户在系统中是否存在,是否有家目录
#!/bin/bash
read -p "input your name: " NAME
if grep "$NAME" /etc/passwd; then
# grep 命令中,如果用户输入的 $NAME 包含特殊字符,可能会导致 grep 命令解释问题。为了避免这个问题,应该将变量 $NAME 放在双引号中,以确保输入的字符串被正确解释。
echo "The user $NAME exists on this system."
elif [ -d "/home/$NAME" ]; then #[ -d "/home/$NAME" ] 实际上是在调用一个名为 test 的命令,其中 -d 是一个参数,用于检查目录是否存在。
echo "The user $NAME does not exist on this system."
echo "The user $NAME has a home directory."
else
echo "The user $NAME does not exist on this system."
echo "The user $NAME does not have a home directory."
fi
例:数字比较大小
1 #!/bin/bash
2 if [ $1 -eq $2 ];then
3 echo "it's ok"
4 else
5 echo "it's error"
6 fi
例:字符比较大小
1 #!/bin/bash
2 VAR1=test
3 VAR2=Test
4 if [ $VAR1 \> $VAR2 ];then
5 echo "$VAR1 > $VAR2"
6 else
7 echo "$VAR1 < $VAR2"
8 fi
例:清空日志
1 #!/bin/bash
2 # clear /var/log/messages
3 # 确定当前是root用户
4 if [ $USER != "root" ];then
5 echo "你必须使用root用户才能执行脚本"
6 exit 10
7 fi
8
9 # 判断文件是否存在
10 if [ ! -f /var/log/messages ];then
11 echo "文件不存在"
12 exit 12
13 fi
14
15 # 保留最近100行日志
16 tail -100 /var/log/messages > /var/log/mesg.tmp
17
18 # 日志清理
19 > /var/log/messages
20 mv /var/log/mesg.tmp /var/log/messages
21 echo "logs clean up"
[[]] 和 []区别
[[]] 和 [] 都是用于条件测试的语法,但它们之间有一些区别。它们分别是 Bash 中的不同条件判断语法。以下是它们的区别:
-
[ ](方括号):方括号是传统的条件测试语法,在 Bash 中也称为
test命令的等效写法。方括号内的条件表达式用于测试条件是否为真,并返回退出码来表示测试的结果。需要注意的是,方括号内的条件表达式和运算符之间需要有空格来分隔。例如:if [ "$var" -eq 10 ]; then echo "var is equal to 10" fi这里,
-eq是数值相等的比较运算符。 -
[[ ]](双方括号):双方括号是 Bash 的扩展条件测试语法。它提供了更丰富的条件判断功能,支持更多的逻辑和字符串操作,还可以省略变量的引号。在双方括号中,不需要在运算符两侧使用空格。例如:
if [[ $var -eq 10 ]]; then echo "var is equal to 10" fi注意,双方括号内的变量不需要引号。而且,双方括号支持更多的逻辑操作,如
&&和||。
相比之下,[[ ]] 的语法更加强大和灵活,通常在 Bash 脚本中更常用,特别是当需要进行复杂的条件判断时。但需要注意的是,[[ ]] 是 Bash 的扩展语法,可能不在所有的 POSIX 兼容的 shell 中都受支持。在 CentOS 8 中,默认情况下,Bash 是默认的 shell,因此 [[ ]] 是可用的。
通配符
| 通配符 | 说明 | 示例 |
|---|---|---|
* |
匹配零个或多个字符 | *.txt 匹配所有 .txt 文件 |
? |
匹配一个字符 | file?.txt 匹配 file1.txt 等 |
[] |
匹配指定字符集中的任意一个字符 | [abc] 匹配 a、b 或 c |
[!...] 或 [^...] |
匹配不在指定字符集中的任意字符 | [^0-9] 匹配任何非数字字符 |
{} |
创建字符串的组合,逗号分隔 | {file1,file2}.txt 匹配两个文件 |
\ |
用于转义通配符字符,使其作为普通字符 | \* 匹配实际的 * 字符 |
例:/etc目录的备份
1 #!/bin/bash
2 baknamefile=$(date +%F)
3 bakdir=/root/etcbak
4 srcdir=/etc
5 [ -e $bakdir ] ||mkdir $bakdir
6 tar -zcf $bakdir/$baknamefile-etc.tar.gz $srcdir
7 echo "====================="
8 ls -lh $bakdir/$baknamefile-etc.tar.gz
9 echo "backup is ok "
&&和||
在Unix/Linux shell中,&& 和 || 是逻辑操作符,用于执行命令的条件组合。它们被用于控制命令的执行流程,允许根据前一个命令的成功或失败状态来决定是否执行下一个命令。以下是它们的用法:
-
逻辑与
&&:-
command1 && command2: 如果command1执行成功(返回退出码为0),则执行command2。
示例:
、mkdir myfolder && cd myfolder这将首先创建名为
myfolder的文件夹,如果成功创建,则切换到该文件夹。 -
-
逻辑或
||:-
command1 || command2: 如果command1执行失败(返回退出码非零),则执行command2。
示例:
rm non_existent_file || echo "File does not exist."这将尝试删除一个不存在的文件,如果删除失败,则输出 "File does not exist."。
-
这些逻辑操作符可以用于构建更复杂的命令组合。例如,您可以在脚本中使用它们来处理错误情况,避免执行不必要的操作,以及根据条件选择性地执行命令。
请注意,&& 和 || 都是短路操作符,这意味着如果前一个命令的结果已经能够决定最终结果,后续的命令将不会被执行。
4、实战shell脚本
例:查看服务状态
1 #!/bin/bash
2 if [ $# -ge 1 ]; then
3 systemctl status $1 > /dev/null
4 if [ $? == 0 ]; then
5 echo "$1 服务正在运行"
6 else
7 systemctl start $1
8 if [ $? == 0 ]; then
9 echo "$1 服务已成功启动"
10 else
11 echo "无法启动 $1 服务"
12 fi
13 fi
14 else
15 echo "执行脚本的格式"
16 echo "sh $0 服务名"
17 fi
例:日志清理
1 #!/bin/bash
2 # clear /var/log/messages
3 # 确定当前是root用户
4 if [ $USER != "root" ];then
5 echo "你必须使用root用户才能执行脚本"
6 exit 10
7 fi
8
9 # 判断文件是否存在
10 if [ ! -f /var/log/messages ];then
11 echo "文件不存在"
12 exit 12
13 fi
14
15 # 保留最近100行日志
16 tail -100 /var/log/messages > /var/log/mesg.tmp
17
18 # 日志清理
19 > /var/log/messages
20 mv /var/log/mesg.tmp /var/log/messages
21 echo "logs clean up"
例:etc备份
1 #!/bin/bash
2 baknamefile=$(date +%F)
3 bakdir=/root/etcbak
4 srcdir=/etc
5 [ -e $bakdir ] ||mkdir $bakdir
6 tar -zcvf $bakdir/$baknamefile-etc.tar.gz $srcdir
7 echo "====================="
8 ls -lh $bakdir/$baknamefile-etc.tar.gz
9 echo "backup is ok "
10

浙公网安备 33010602011771号