https://www.jianshu.com/p/3557bf2da86a
一、if 判断
if ... then ... fi
单层
如果 是真的 那么 ...
if [ 条件判断式 ];then
当条件判断式成立时,可以进行的命令。
fi # 结束这个判断语句结构
if ... then ... else....fi
多重、复杂条件判断式
如果 是真的 那么 ... 否则 ...
一颗红心,两手准备
if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
else
当条件判断式不成立时,可以进行的指令工作内容;
fi
if ... elif ... elif ... else ... fi
多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
注意
elif
也是个判断式,因此出现elif
后面都要接then
来处理!但是else
已经是最后的没有成立的结果了, 所以else
后面并没有then
实战案例
服务状态检测工具
通过获取目前系统中监听的端口,判断都有那些服务处于运行状态
二、 利用 case ..... esac 判断
基本语法
case $变量名称 in <==关键字为 case ,还有变量前有钱字号
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为小括号 )
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用 * 来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序运行段
exit 1
;;
esac <==反过来写,结束当前语句结构!
运维工具箱
========================================================
模式还可以是多个
#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
read -p "Your choice" choice
case $choice in
m|M)
free -m
;;
d|D)
df -h
;;
q|Q)
exit
;;
*)
eco "Invalid input"
;;
esac
三、while ... do ... done (不确定的循环)
while [ condition ] ==>中括号内的状态就是判断式
do ==> do 是循环的开始!
代码段
代码段
done ==> done 是循环的结束
计数
每次循环体执行完,while 都会检查条件是否为真,为真继续循环,否则终止循环。
n=0
while [ "$n" -lt 5 ]
do
let n++
echo "$n"
done
读文件
while read line
do
echo $line
done < /etc/passwd
五、 for do done (固定的循环)
for var in con1 con2 con3 ...
do
程序段
done
var 是变量名
con1 con2 con3
是常量,就是具体的数据
也可以是一个已经被赋值的变量, 写法${val1} ${val2}
以上面的例子来说,这个
$var
的变量内容在循环工作时:
- 第一次循环时,
$var
的内容为 con1 ;- 第二次循环时,
$var
的内容为 con2 ;- 第三次循环时,
$var
的内容为 con3 ;- ....
数值运算
➜ ~ n=1
➜ ~ let n++
➜ ~ echo $n
2
➜ ~ (( n++ ))
➜ ~ echo $n
3
➜ ~ a=2
➜ ~ b=3
➜ ~ let f=a+b
➜ ~ echo $n
3
➜ ~ echo $f
5
➜ ~ let f = a + b ==> 错误
zsh: bad math expression: operand expected at `='
➜ ~ let "f = a + b"
➜ ~ echo $f
5
for 循环中 变量的取值方式
a. 从一组字符串中取值
for var in one two three four five
do
echo "****************************"
echo '$var is ' $var
done
b. 从位置变量中取值
for var
do
echo '-----------------------------'
echo '$var is ' $var
done
c. 从累计变化的格式中取值
#!/bin/bash
for ((var=1;var<=10;var++))
do
echo "------------------------"
echo '$var is ' $var
done
d. 从命令结果中取值
#!/bin/bash
for var in $(cat file.txt)
do
echo " ------------------------"
echo '$var is ' $var
done
IFS
for i in {1..5}
do
echo $i
done
IFS=$'\n'
for line in $(cat test.sh)
do
echo "--------"
echo $line
done
export IFS=$IFS
六、break 和 continue
心得
一、if判断
if...then...fi
单层
如果 是真的 那么...
if [ 条件判断式 ];then
......代码块 #条件成立,执行代码块
fi #结束这个判断
举例:
[root@mini ~]# cat if-fi.sh
if [ ! -z $1 ] && [ ! -z $2 ];then
if [ "$1" -eq "$2" ];then
echo "相等"
fi
fi
[root@mini ~]#
if... then ... else...fi
多重、复杂条件判断
如果 是真的 那么 ....
if [ 条件判断式 ];then
......代码块 #条件成立,执行代码块
else
......代码块 #条件不成立,执行代码块
fi
举例:
var=8
read -p "请输入要比较的数字:" l
echo $l
echo "定义的变量是$var"
if [ ! -z $l ];then
if [ "$var" -eq "$l" ];then
echo "${var}等于 $l"
elif [ "$var" -gt "$l" ];then
echo "${var} 大于 $l"
elif [ "$var" -lt "$l" ];then
echo "${var} 小于 $l"
fi
fi
if ... elif ... elif ... else ... fi
多重条件判断,根据不同的条件,执行不同的代码块
if [ 条件一 ];then
...代码块 #条件一成立,执行该代码块
elif [ 条件二 ];then
... 代码块 #条件二成立,执行该代码块
elif [ 条件三 ];then
... 代码块 #条件三成立,执行该代码块
else
... 代码块 #条件一与条件二与条件三均不成立,执行该代码块
fi
注意:
elif
后面的分号;
与then
都要写
二、利用case ......esac 判断
基本语法
case $变量名 in
"第一个变量内容")
...代码块
;;
"第二个变量内容")
...代码块
;;
*)
exit 1
;;
esac
注意:变量名有
$
符号
该语法是根据变量的内容选择运行的代码块,若运行了代码块,则会退出选择。
case esac
是一对
*)代表其他情况
不能忘记两个分号;;
==================
模式
#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
read -p "Your choice" choice
case $choice in
m|M)
free -m
;;
d|D)
df -h
;;
q|Q)
exit
;;
*)
eco "Invalid input"
;;
esac
三、while ... do ... done (不确定的循环)
while [ 条件 ]
do
...代码块 #条件成立,运行该代码块
done
注意:
do
是循环的开始done
是循环的结束
计数
每次循环体执行完都会检查条件是否为真,若为真则继续循环,否则终止循环。
例子:
n=0
while [ "$n" -lt 5 ]
do
let n++
echo "$n"
done
按行读文件
while read line
do
echo $line
done < /etc/passwd
五、for do done(固定的循环)
for var in con1 con2 con3 ...
do
...程序块
done
var 是变量名
con1 con2 con3 是常量,就是具体数值 也可以一个已经被赋值的变量,写法
${val1} ${val2}`
以上面的例子来说,这个
$var
的变量内容在循环工作室:
- 第一次循环时,
$var
的内容是con1;- 第二次循环时,
$var
的内容是con2;- 第三次循环时,
$var
的内容是con3;- ...
数值运算
n=1
let n++
echo $n
2
(( n++ ))
echo $n
3
a=2
b=3
let f=a+b
echo $n
3
echo $f
5
let f = a + b ==> 错误
zsh: bad math expression: operand expected at `='
let "f = a + b"
echo $f
5
for 循环中 变量的取值方式
a. 从一组字符串中取值
for var in one two three four five
do
echo "****************************"
echo '$var is ' $var
done
b. 从位置变量中取值
for var
do
echo '-----------------------------'
echo '$var is ' $var
done
运行脚本a.sh
sh a.sh a b c d e f
echo "arg nums ==> ${#}"
echo "所有的参数是 |$@|"
echo "$*"
echo "first arg $1"
echo "second arg $2"
var=$3
echo $var
echo "本程序是:$0"
运行脚本par_args.sh
c. 从累计变换的格式中取值
#!/bin/bash
for ((var=1;var<=10;var++))
do
echo "------------------------"
echo '$var is ' $var
done
d.从命令结果中取值
#!/bin/bash
for var in $(cat file.txt)
do
echo " ------------------------"
echo '$var is ' $var
done
for i in {1..5}
do
echo $i
done
IFS
IFS=$'\n'
for line in $(cat test.sh)
do
echo "--------"
echo $line
done
export IFS=$IFS
六、break和continue
break可以跳出循环体,break后面加数字可以跳出相应的循环层数
for i in {1..6}
do
for w in a b c
do
if [ "$i" -eq 4 ];then
break 2
fi
echo "$i --> $w"
done
done
continue是跳出本次循环,continue下面的代码不再执行,下次循环开始