2019-03-07笔记—shell脚本编程二(循环判断语法)

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" [email protected]
    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" … " n” 的形式输出所有参数。

但是当它们被双引号("")包含时,"$*“会将所有的参数作为一个整体,以”$1 $2 … n " " n"的形式输出所有参数;" @" 会将各个参数分开,以"$1" “ 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[@]} ,显示整个数组
[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

猜你喜欢

转载自blog.csdn.net/ai_benwoniu/article/details/88313653