shell 中的逻辑判断
if 判断格式
写法 1:if ? 条件 ; then ? 语句; fi
- #! /bin/bash
- if [-d /usr/local/zabbix]
- then
- ? echo 123
- fi
写法 2:if 条件; then 语句; else 语句; fi
- #! /bin/bash
- if [ -d /usr/local/zabbix ]
- then
- ? echo 123
- else
- ? mkdir /usr/local/zabbix
- fi
写法 3:if 条件; then 语句; elif 条件; then 语句; else 语句; fi
- a=4
- if [ $a -gt 3 ]
- then
- ? echo "<4 &&>1"
- elif [ $a -gt 5 ]
- ? echo "<5 &&>1"
- else
- ?echo "null"
- fi
if 判断还支持多个条件并写, 一次判断多个条件, 如下面的格式
- if [ -d /usr/local/zabbix ] && [ -f /usr/local/zabbix/1.txt ]
- then
- ? mkdir /usr/local/zabbix/src
- else
- ? exit
- fi
if 判断文件, 目录属性
[ -f file ] 判断是否是普通文件, 且存在
[ -d file ] 判断是否是目录, 且存在
[ -e file ] 判断文件或者目录是否存在
[ -r file ] 判断文件是否可读
[ -w file ] 判断文件是否可写
[ -x file ] 判断文件是否可执行
判断一个文件是否是普通文件并且存在
- #! /bin/bash
- # 判断文件是否存在, 若不存就创建
- f="/usr/local/src/zabbix"
- if [ -f $f ]
- then
- ?echo $f is yes
- else
- touch $f
判断是否存在这个目录, 如果不存在则创建
- #! /bin/bash
- d="/usr/local/src/zabbix"
- if [ -d $d ]
- ?then
- ? ?echo $d
- ?else
- mkdir $d
判断文件或目录是否存在
- #! /bin/bash
- # -e 不管是文件或目录, 是判断是否存在
- f="/usr/local/src/zabbix"
- if [ -e $f ]
- then
- ?echo $f
- else
- mkdir $f
- fi
判断文件是否可读, 目录可读则可以查看目录下文件. 文件可读则可以查看内容
- #! /bin/bash
- f="/usr/local/src/zabbix"
- if [ -r $f ]
- then
- echo $f
- fi
if 特殊用法
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 的值不为空
if [ -z "$a" ] ? 表示当变量 a 的值为空
判断一个变量或文件不为空或存在内容
- #! /bin/bash
- a=4
- if [ -z "$a" ]
- then
- echo "no null"
- else
- ?echo "The shell a is null"
- fi
判断一个变量或文件不为空
可以用于文件判断, 如果变量不为空则执行或继续判断. 如果文件不为空则不针对这个文件做操作或终止执行
- #! /bin/bash
- a=/src/1.txt
- if [ -n "$a" ]
- then
- echo "no null"
- else
- ?echo "touch /src/1.txt"
- fi
将一条命令作为判断条件, 判断 / etc/passwd 文件中是否存在 root 字段, 如果有 root 字段则输出, 没有则不输出
- #! /bin/bash
- if [ -n `grep -wq "root" /etc/passwd` ]
- then
- echo "no null"
- fi
grep -q 表示过滤某个文件内容的时候, 不需要把结果输出显示出来
sh -x 执行过程
- [root@localhost src]# sh -x 1.sh
- ++ grep -wq root /etc/passwd
- + '[' -n ']'
- + echo 'no null'
- no null
?cace 判断
case 逻辑判断
这个脚本的目的是让用户输入一个数字, 然后用这个脚本去判断用户输入的数字的一个范围
- ! /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
- 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
- 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: linux
- + '[' -z linux ']' // 判断 linux 变量是否存在
- ++ sed 's/[-0-9]//g' // 清空 $n1 所有数字
- ++ echo linux
- + n1=linux //$n1 不为空, 所以输入的不是数字有问题
- + '[' '!' -z linux ']'
- + echo 'Please input a number.'
- Please input a number. // 提示请输入数字, 非其他字符串
- + exit 1
来源: http://www.bubuko.com/infodetail-2770477.html