case判断
语法格式:
case 变量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac
#在case程序中,可以在条件中使用|,表示或的意思,比如
2|3)
command
;;
案例说明:
#!/bin/bash
read -p "Please input a number: " n
if [ -z "$n" ] #判断是否为空
then
echo "Please input a number."
exit 1 #异常运行退出程序
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ] #判断不为空
then
echo "Please input a number."
exit 1
fi
if [ $n -lt 60 ] && [ $n -ge 0 ]
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 "not ok"
;;
2)
echo "ok"
;;
3)
echo "ook"
;;
4)
echo "oook"
;;
*)
echo "The number range is 0-100."
;;
esac
- exit(0):正常运行程序并退出程序;
- exit(1):非正常运行导致退出程序;
测试结果:
[root@linux2019 shell]# sh -x case.sh #查看执行过程
+ read -p 'Please input a number: ' n
Please input a number: 98
+ '[' -z 98 ']'
++ echo 98
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 98 -lt 60 ']'
+ '[' 98 -ge 60 ']'
+ '[' 98 -lt 80 ']'
+ '[' 98 -ge 80 ']'
+ '[' 98 -lt 90 ']'
+ '[' 98 -ge 90 ']'
+ '[' 98 -le 100 ']'
+ tag=4
+ case $tag in
+ echo oook
oook
[root@linux2019 shell]# sh case.sh
Please input a number: 123
The number range should be 0-100.
[root@linux2019 shell]# sh case.sh
Please input a number: abc
Please input a number.
for循环
语法格式:
for 变量名 in 条件;
do …;
done
案例说明1:
[root@linux2019 shell]# cat for1.sh
#!bin/bash
#计算1+2+3+...+100
sum=0
for i in `seq 1 100`
do
sum=$[$sum+$i]
echo $i
done
echo $sum
案例说明2:
[root@linux2019 shell]# cat for2.sh
#!/bin/bash
a=0
cd /root/shell
for i in `ls /root/shell/`
do
if [ -d $i ]
then
a=$[$a+1];
ls -d $i;
fi
done
echo $a
[root@linux2019 shell]# sh for2.sh
duan
xiu
2
[root@linux2019 shell]# ll
总用量 12
-rwxr-xr-x 1 root root 664 3月 7 15:20 case.sh
drwxr-xr-x 2 root root 6 3月 7 16:12 duan
-rwxr-xr-x 1 root root 83 3月 7 15:44 for1.sh
-rwxr-xr-x 1 root root 124 3月 7 16:31 for2.sh
drwxr-xr-x 2 root root 6 3月 7 16:13 xiu
seq命令
[root@linux2019 shell]# seq 1 3
1
2
3
[root@linux2019 shell]# seq -w 1 11
01
02
03
04
05
06
07
08
09
10
11
[root@linux2019 shell]# seq 1 3 15
1
4
7
10
13
[root@linux2019 shell]# seq 20 -3 5
20
17
14
11
8
5
while循环
语法格式:
while 条件;
do … ;
done
案例说明1:
#!/bin/bash
#监控系统负载
while :
do
load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
if [ $load -gt 10 ]
then
top|mail -s "load is high: $load" 123@abc.com
fi
sleep 30
done
案例说明2:
#!/bin/bash
while :
do
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "you need input sth."
continue
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "you just only input numbers."
continue
fi
break
done
echo $n
break跳出循环
[root@linux2019 shell]# cat break.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i == 3 ]
then
break
fi
echo $i
done
echo abcabcabc
[root@linux2019 shell]# sh break.sh
1
1
2
2
3
abcabcabc
#当i=3时候,通过break直接结束循环,最后打印abcabcabc;
continue结束本次循环
[root@linux2019 shell]# cat continue.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i == 3 ]
then
continue
fi
echo $i
done
echo $i
[root@linux2019 shell]# sh continue.sh
1
1
2
2
3
4
4
5
5
5
#但i=3时候。通过continue结束本次循环,跳过fi后面的打印$i的命令,开始继续下一次循环
exit直接退出脚本
[root@linux2019 shell]# cat exit.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i == 3 ]
then
exit
fi
echo $i
done
echo abcabc
[root@linux2019 shell]# sh exit.sh
1
1
2
2
3
遍历文件或者目录
相对来说while循环更适合,空格会影响for循环对行的判断
[root@linux2019 shell]# for i in `cat /etc/passwd` ;do echo $i; echo "##########";done
[root@linux2019 shell]# cat /etc/passwd|while read i;do echo $i;echo "#########";done
[root@linux2019 shell]# for i in `ll` ;do echo $i; echo "##########";done
[root@linux2019 shell]# ll |while read i;do echo $i;echo "#########";done
函数
案例说明1:
[root@linux2019 shell]# sh -x function1.sh
+ input 11 ab cd
+ echo 11 ab 3 function1.sh
11 ab 3 function1.sh
[root@linux2019 shell]# cat function1.sh
#!/bin/bash
function input()
{
echo $1 $2 $# $0
}
input 11 ab cd
- $0—当前脚本的文件名
- $n—传递给脚本或函数的参数,n是一个数字,表示第几个参数
- $#—传递给脚本或函数的参数个数
- $?—上个命令的退出状态,或函数的返回值
- $$—当前Shell进程ID
- $*—传递给脚本或函数的所有参数
- $@—传递给脚本或函数的所有参数
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。
但是当它们被双引号("")包含时,"$*“会将所有的参数作为一个整体,以”$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;" n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。
案例说明2:
[root@linux2019 shell]# cat function2.sh
#!/bin/bash
function sum() {
s=$[$1+$2]
echo $s
}
sum 12 34
[root@linux2019 shell]# sh -x function2.sh
+ sum 12 34
+ s=46
+ echo 46
46
案例说明3:
[root@linux2019 shell]# sh -x function3.sh
+ read -p 'Please input the eth name: ' e
Please input the eth name: ens33
++ ip ens33
++ ifconfig
++ tail -1
++ grep -A1 ens33
++ awk '{print $2}'
+ myip=192.168.85.129
+ echo 'ens33 address is 192.168.85.129'
ens33 address is 192.168.85.129
[root@linux2019 shell]# cat function3.sh
#!/bin/bash
function ip()
{
ifconfig |grep -A1 "$e" |tail -1|awk '{print $2}'
}
read -p "Please input the eth name: " e
myip=`ip $e`
echo "$e address is $myip"
数组
定义数组
- echo ${#a[@]}—获取数组的元素个数
- echo ${a[2]}—读取第三个元素,数组从0开始
- echo a [ ∗ ] − − − 等 同 于 {a[*]}---等同于 a[∗]−−−等同于{a[@]} ,显示整个数组
[root@linux2019 ~]# a=(a b c 1 2 3 d e)
[root@linux2019 ~]# echo {a[*]}
{a[*]}
[root@linux2019 ~]# echo ${a[*]}
a b c 1 2 3 d e
[root@linux2019 ~]# echo ${#a[*]}
8
[root@linux2019 ~]# echo ${a[4]}
2
[root@linux2019 ~]# echo ${a[*]:0-3:2}
3 d
数组赋值和删除
- 赋值,a[8]=f(为数组第9个元素赋值)
- 删除,unset a(删除整个数组); unset a[0](删除数组第一个元素)
[root@linux2019 ~]# a[8]=f
[root@linux2019 ~]# echo ${a[*]}
a b c 1 2 3 d e f
[root@linux2019 ~]# unset a[0]
[root@linux2019 ~]# echo ${a[*]}
b c 1 2 3 d e f
如果数组目标不存在则会自动添加一个元素
[root@linux2019 ~]# a[15]=z
[root@linux2019 ~]# echo ${#a[@]}
9
[root@linux2019 ~]# echo ${a[@]}
b c t 2 3 d e f z
[root@linux2019 ~]# echo ${a[12]}
[root@linux2019 ~]# echo ${a[15]}
z
数组分片
a=(seq 1 5
)
echo ${a[@]:0:3} 从第一个元素开始,截取3个
echo ${a[@]:1:4} 从第二个元素开始,截取4个
echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个
[root@linux2019 ~]# echo ${a[*]:3:3}
2 3 d
[root@linux2019 ~]# echo ${a[*]}
b c t 2 3 d e f z
[root@linux2019 ~]# echo ${a[*]:0-3:2}
z #因为之前添加了a[15]的元素,中间虽然没有赋值,但是数组的序号都是对应的,中间的元素都是空,数组元素个数也是如此
[root@linux2019 ~]# echo ${#a[*]}
9
数组替换
[root@linux2019 ~]# echo ${a[*]}
b c t 2 3 d e f z
[root@linux2019 ~]# echo ${a[*]/b/1}
1 c t 2 3 d e f z
[root@linux2019 ~]# echo ${a[*]}
b c t 2 3 d e f z
[root@linux2019 ~]# a=(${a[*]/b/1})
[root@linux2019 ~]# echo ${a[*]}
1 c t 2 3 d e f z