在shell脚本当中很多地方都会用到逻辑判断,判断某一个数值,判断某个目录或文件,然后针对判断的结果再做一个操作,若没有判断,是无法进行一些操作的.
例如cp一些文件,或者MV,或是删除某个文件,没有判断,写这些命令就没什么意义,也就不叫作shell脚本,可见shell脚本非常重要.
格式1:if条件;then 语句;if
格式2:if条件;then 语句;else 语句;if
格式3:if ....; then ....;elif...; then...; else...; fi
-lt (小于)
-gt (大于)
-le (小于或等于)
-ge(大于或等于)
-eq(等于)
-ne(不等于)
&& 表示并且
|| 表示或者
#在命令行里也可以实现,不一定要写shell脚本才可以实现,只不过使用命令去实现需要使用分号. [root@123 ~]# for i in `seq 1 5`; do echo $i; done 1 2 3 4 5 #不使用分号将会是这样的 [root@123 ~]# for i in `seq 1 5` > do > echo $i > done 1 2 3 4 5
格式1:if条件;then 语句;if
在命令行操作 [root@123 ~]# a=6 [root@quandong ~]# if [ $a -gt 3 ]; then echo ok; fi ok 说明:方括号两边需要有空格,-gt 是大于, $a大于3,那么这肯定OK的. 在脚本里写,就整理一下格式即可,然后再执行 [root@123 sbin]# cat 04.sh #! /bin/bash a=6 if [ $a -gt 3 ] then echo ok fi [root@123 sbin]# sh 04.sh ok
格式2:if条件;then 语句;else 语句;if
[root@123 sbin]# vim 05.sh #! /bin/bash a=2 if [ $a -gt 3 ] then echo ok else echo nook fi [root@123 sbin]# sh -x 05.sh + a=2 + '[' 2 -gt 3 ']' + echo nook nook #如果$a 大于3,输出OK, 否则(else),输出nook
# 满足一个条件的情况 [root@123 sbin]# vim 06.sh #! /bin/bash a=6 if [ $a -gt 3 ] then echo ">3" elif [ $a -lt 8 ] echo "<8 && >3" else echo nook fi #执行过程 [root@123 sbin]# sh -x 06.sh + a=6 + '[' 6 -gt 3 ']' + echo '>3' >3 说明:如果$a 大于3,输出>3 ;又如果(elif)$a 小于8,输出<8 && >3 那满足了第一个条件,$a 大于3,输出>3,后面的条件就不再执行了. elif 是可以使用多次的; lt 是小于 #所有条件都不满足的情况 [root@123 sbin]# vim 06.sh #! /bin/bash a=6 if [ $a -gt 7 ] then echo ">7" elif [ $a -lt 5 ] then echo "<5 && >7" else echo "nook" fi 执行过程 [root@123 sbin]# sh -x 06.sh + '[' 6 -gt 7 ']' + '[' 6 -lt 5 ']' + echo nook nook 说明:如果$a 大于7,输出>7,不满足,执行下一个条件,又如果$a 小于5,输出<5 && >7,都不满足,输出nook
[ -f file ] 判断是否是普通文件,且存在
[ -d file ] 判断是否是目录,且存在
[ -e file ] 判断文件或者目录是否存在
[ -r file ] 判断文件是否可读
[ -w file ] 判断文件是否可写
[ -x file ] 判断文件是否可执行
# 判断文件是否存在,若不存就创建 [root@123 sbin]# vim file1.sh #! /bin/bash f="/tmp/Annalinux" if [ -f $f ] then echo $f exist else touch $f fi #执行过程 [root@123 sbin]# sh -x file1.sh + f=/tmp/Annalinux + '[' -f /tmp/Annalinux ']' + touch /tmp/Annalinux 说明:if [ -f $f ] 判断/tmp/Annalinux 是否存在,明显是不存在的,所有就touch 了这个文件 # 重新执行一次,判断文件是否存在,若存就输出结果 [root@123 sbin]# sh -x file1.sh + f=/tmp/Annalinux + '[' -f /tmp/Annalinux ']' + echo /tmp/Annalinux exist /tmp/Annalinux exist 说明:前面不存在就touch了, 重新再执行一次肯定是存在的这个文件,那么判断输出是存在
# 判断目录是否存在,若不存在就创建 [root@123 sbin]# cat file2.sh #! /bin/bash d="/tmp/Anna" if [ -d $d ] then echo $d exist else mkdir $d fi #执行过程 [root@123 sbin]# sh -x file2.sh + d=/tmp/Anna + '[' -d /tmp/Anna ']' + mkdir /tmp/Anna 说明:if [ -d $d ] 判断/tmp/Annalinux 是否存在,明显是不存在的,所有就mkdir 了这个文件 #重新执行一次,判断目录是否存在,若存在就输出 [root@123 sbin]# sh -x file2.sh + d=/tmp/Anna + '[' -d /tmp/Anna ']' + echo /tmp/Anna exist /tmp/Anna exist 说明:前面不存在就mkdir了, 重新再执行一次肯定是存在的这个文件,那么判断输出是存在
[ -e file ] 判断文件或者目录是否存在
[root@123 sbin]# cat file2.sh #! /bin/bash f="/tmp/Anna" if [ -e $f ] then echo $f exist else mkdir $f fi #执行过程 [root@123 sbin]# sh -x file2.sh + f=/tmp/Anna + '[' -e /tmp/Anna ']' + echo /tmp/Anna exist /tmp/Anna exist 说明:-e 不管是文件或目录,是判断是否存在,不存在的话就touch
[root@123 sbin]# vim file2.sh #! /bin/bash f="/tmp/Anna" if [ -r $f ] then echo $f readable fi #执行 [root@123 sbin]# sh file2.sh /tmp/Anna readable
[root@123 sbin]# vim file2.sh #! /bin/bash f="/tmp/Anna" if [ -r $f ] then echo $f readable fi #执行 [root@123 sbin]# sh file2.sh /tmp/Anna writeable 说明:可写是针对当前root用户,若切换到quandong用户,那么就只有可读的权限,没有可读权限
[root@123 sbin]# vim file2.sh #! /bin/bash f="/tmp/Anna" if [ -x $f ] then echo $f exeable fi #执行 [root@123 sbin]# sh file2.sh /tmp/Anna exeable 说明:可写是针对当前root用户,若切换到quandong用户,那么就只有可读的权限,没有可执行权限
[root@123 sbin]# vim file2.sh #! /bin/bash d="/tmp/Anna" if [ -d $d ] then rmdir $d fi #执行 [root@123 sbin]# sh -x file2.sh + d=/tmp/Anna + '[' -d /tmp/Anna ']' + rmdir /tmp/Anna #判断一个目录是否存在,如果存在就输出This is ok, 若不存在就创建 [root@123 sbin]# vim file2.sh #! /bin/bash d="/tmp/Anna" if [ -d $d ] then echo "This is ok" else [ -d $d ] mkdir $d fi #执行 [root@123 sbin]# sh -x file2.sh + d=/tmp/Anna + '[' -d /tmp/Anna ']' + echo 'This is ok' This is ok
if [ -z "$a" ] 表示当变量a 的值为空时会怎么样
if [ -n "$a" ] 表示当变量a的值不为空
if grep -q '123' 1.txt; then 表示如果1.txt中含有‘123’的行时会怎样
if [ ! -e file ]; then ... 表示文件不存在时会怎样
if (($a<1)); then .. 等同于 if [ $a -lt 1 ]; then...
[ ] 中不能使用 <,>, ==, !=,>=,<=这样的符号
if [ -n "$a" ] 表示当变量a的值不为空 [root@123 sbin]# if [ -n 09.sh ]; then echo ok; else echo "09.sh is null"; fi ok 说明: 判断01.sh 是否为空,不为空 ,输出is ok # if [ -z "$a" ] 表示当变量a 的值为空 [root@123 sbin]# if [ -z "$b" ]; then echo no null; fi no null 说明:
[root@123 sbin]# vim file3.sh #! /bin/bash if [ ! -f /tmp/Annalinux ] then echo "No such file or directory" exit fi if [ -f /tmp/Annalinux ] then echo "This is file" exit fi [root@123 sbin]# sh -x file3.sh + '[' '!' -f /tmp/Annalinux ']' + '[' -f /tmp/Annalinux ']' + echo 'This is file' This is file + exit 说明: 先判断/tmp/Annalinux 文件是否存在,如果不存在,输出 No such file or directory。并退出 如果存在,输出This is file,并退出. ! -F 表示不存在 -f 表示存在 ! -f 和 -f 意思相反
[root@123 sbin]# if grep -w 'apache' /etc/passwd; then echo "apache exist"; fi apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin apache exist [root@quandong sbin]# if grep -wq 'apache' /etc/passwd; then echo "apache exist"; fi apache exist 说明: 如果apache这个单词在/etc/passwd 这个文件存在,输出apache exist grep -w 选项表示匹配一个单词, -q不显示任何信息 [root@123 sbin]# if ! grep -w 'user1' /etc/passwd; then echo useradd user1; fi useradd user1 说明: if ! grep -w 'user1' 取反的意思,如果user1这个用户不存在,那么创建user1用户.
说明:这个脚本的目的是让用户输入一个数字,然后用这个脚本去判断用户输入的数字的一个范围
[root@123 sbin]# vim case.sh #! /bin/bash read -p " Please input a number: "n if [ -z "$n" ] //判断 $n是否为空, 为空的话,说明用户没有输入数字 then echo "Please input a number." //那么就提示请输入数字 exit 1 //然后退出来,返回一个数值 1 fi n1=`echo $n |sed 's/[-0-9]//g'` //判断输入的是否是纯数字,echo 出来后,做一个特殊操作,使用sed 把所有 的数字 0-9 清空, $n1 这个变量就为空了 if [ ! -z $n1 ] // 当变量不为空时,说明输入的不是数字,不合法,则提示继续输入数字 当变量为空时继续往下执行,说明输入的是数字 then echo "Please input a number." //继续提示输入数字 exit 1 //继续退出来,返回一个数值 1 #elif [ $n -lt 0 ] || [ $n -gt 100 ] #then # echo "Then number range is 0-100." # exit 1 fi if [ $n -lt 60 ] then tag=1 elif [ $n -ge 60 ] && [ $n -lt 80 ] then tag=2 elif [ $n -ge 80 ] && [ $n -lt 90 ] then tag=3 elif [ $n -ge 90 ] && [ $n -le 100 ] then tag=4 else tag=0 fi case $tag in 1) echo " 不及格" ;; 2) echo "及格" ;; 3) echo "良好" ;; 4) echo "优秀" ;; *) echo "The number range is 0-100." ;; esac # read -p " Please input a number: "n 说明 n 作为捕获一个变量的名字,用户输入什么数字,那么这个n 就会赋值什么数字,这就是read -p 的作用 演示: [root@123 sbin]# read -p " Please input a number: " n Please input a number: 100 [root@123 sbin]# echo $n 100 [root@123 sbin]# read -p " Please input a number: " n Please input a number: 800 [root@123 sbin]# echo $n 800 #执行,输入数字90 [root@123 sbin]# sh -x case.sh + read -p ' Please input a number: ' n Please input a number: 90 + '[' -z 90 ']' //判断 90 变量是否存在 ++ sed 's/[-0-9]//g' // $n1 清空 ++ echo 90 + n1= //$n1 为空 + '[' '!' -z ']' // 判断是否不为空,不为空说明正常,往下匹配 + '[' 90 -lt 60 ']' + '[' 90 -ge 60 ']' + '[' 90 -lt 80 ']' + '[' 90 -ge 80 ']' + '[' 90 -lt 90 ']' + '[' 90 -ge 90 ']' + '[' 90 -le 100 ']' + tag=4 //匹配到了第4个条件 + case $tag in + echo $'\344\274\230\347\247\200' 优秀 # 执行,输入非数字,就会提示请输入数字 [root@123 sbin]# sh -x case.sh + read -p ' Please input a number: ' n Please input a number: gsagas + '[' -z gsagas ']' //判断 gsagas 变量是否存在 ++ sed 's/[-0-9]//g' //清空$n1 所有数字 ++ echo gsagas + n1=gsagas //$n1不为空,所以输入的不是数字有问题 + '[' '!' -z gsagas ']' + echo 'Please input a number.' Please input a number. //提示请输入数字 + exit 1