过程式编程语言的代码执行顺序:
顺序执行:逐条运行;
选择执行:
代码存在一个分支,条件满足时才执行;
两个或以上的分支,只会执行其中一个满足条件的分支
循环执行:
代码片段(循环体)要执行0,1,或多个来回
选择执行的格式:
1.&&,||
2.if 语句
3.case语句
if语句格式:
单分支的if语句
if 测试条件 then; 或 if 测试条件
then
代码分支 代码分支
fi fi
双分支的if语句:
if 测试条件;then
条件为真时执行的分支
else
条件为假时执行的分支
fi
多分支if语句
if CONDITION1;then
条件1为真分支
elif CONDITION2;then
条件2为真分支
elif CONDITION3;then
条件3为真分支
....
else
所有条件均不满足时的分支
fi
练习:
1.通过命令行参数给定两个数字,输出其中较大的数值
2.通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数;
3.通过命令行参数给定两个文本文件名,如果某文件不存在,则结束脚本执行;都存在时返回每个文件的行数,并说明其中行数较多的文件;
read命令:
用户交互:通过键盘输入数据
read [option]....[name...]
-p ‘format‘
-t timeout
eg: read -t 5 -p "please echo a passwd: " passwd(这个是变量名)
注意read赋值的对应关系:
[root@]localhost ~] # read a b
tom jerry
[root@]localhost ~] # echo $a $b
tom jerry
[root@]localhost ~] # read a b c
tom jerry
[root@]localhost ~] # echo $a $b $c
tom jerry
[root@]localhost ~] # read a b
tom jerry jenny
[root@]localhost ~] # echo $a $b
tom jerry jenny
if 语句可嵌套if语句,也可嵌套其他语法结构
各结构都可相互嵌套
循环执行: 将一段代码重复执行0,1或多次
进入条件: 条件满足才进入循环
退出条件:每个循环都应该有退出条件,否则可能进入死循环
bash脚本:
for 循环
while 循环体
until 循环
for 循环:
for循环的结构模式:
for VARIABLE in LIST;do
循环体
done
两种格式:
1.遍历列表,
进入条件:只要列表有元素,就进入循环
退出条件:列表中的元素遍历完成
LIST的生成方式:
1.直接给出
2.整数列表
a.{start,end}
b.seq [start] [步长] end
3.返回列表的命令,比如ls
4.glob,ls /var/lib/a*
5.变量引用 $@,$*
2.控制变量
eg:
#!/bin/bash
#
for filename in 1 3 5 7 ;do
touch /tmp/fench$filename 会创建出fench1,fench3。这里可以直接将变量的结果和fench组合其他
done
练习:
1、分别求100以内所有偶数的和,以及所有奇数的和
[root@localhost scripts]# cat qiuhe.sh
#!/bin/bash
#
declare -i sum_ou
declare -i sum_ji
for I in {1..100};do
u=$[$I%2]
if [ "$u" -eq "0" ];then
sum_ou+=$I
else
sum_ji+=$I
fi
done
echo $sum_ou
echo $sum_ji
2、计算当前系统上所有用户的id之和
[root@localhost scripts]# cat id_sum.sh
#!/bin/bash
#
declare -i sum
for I in `cut -d: -f3 /etc/passwd`;do
sum+=$I
done
echo $sum
3、通过脚本参数传递一个目录给脚本,然后计算此目录下所有文本文件的行数之和,并说明此类文件的总数
[root@localhost scripts]# cat linesum.sh
#!/bin/bash
#
declare -i sum
declare -i sum2
for I in `find $1 -type f`;do
sum+=`wc -l $I |cut -d‘ ‘ -f1`
sum2+=1
done
echo $sum
echo $sum2
4、写一个脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
#!/bin/bash
#
if [[ $1 =~ ^0*[1-9][0-9]*$ ]] ;then 注意此处正整数的写法
echo "you have input a zhengshu"
else
echo "wrong"
fi
2、while循环语句
while CONDITION1;do
循环体
循环控制变量修正表达式
done
条件进入:CONDITION测试为真
条件退出:CONDITION测试为假
这个循环会一直进行,直到遇到break。
while(true){
String aa=in.readLine();
}
while(true) ... break 结构有其等价的格式
for(;;){
//todo:do something
... break;
}
3、until循环语句
until CONDITION;do
循环体
循环控制变量修正表达式
done
条件进入:CONDITION测试为假
条件退出:CONDITION测试为真
4、case选择执行语法, 注意各分支的顺序,如果一个条件可以同时被两个分支匹配到,那么会应用第一个匹配到的分支的效果
case $variable in
pattern1)
分支1
;;
pattern2)
分支2
;;
pattern3)
分支3
;;
*)
分支N
esac
case支持glob网络的通配符:
* :任意长度任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
eg:
[1-3]、[a-c]等
错误[23-43] 1[2]-2[1]
a|b :a或者b
eg:当用户输入y,Y,yes,YEs等大小写都可以匹配
1 #!/bin/bash
2 read -p "Please enter your choice:(yes):" choice
3 change=`echo $choice |tr A-Z a-z`
4 case $change in
5 yes|y)
6 echo -e "\033[33mthe script continues to run\033[0m"
7 ;;
8 no|n)
9 echo -e "\033[32mthe script is exit\033[0m"
10 ;;
11 *)
12 echo -e "\033[34mPlease enter yes or no\033[0m"
13 ;;
14 esac
第二种方法:
case $1 in
[yY]|[yY][eE][Ss])
echo "you put a $1"
;;
[nN]|[nN][Oo])
echo "you put a $1"
;;
*)
echo "ukown"
;;
esca
十五、在循环中控制循环的方法
1、continue
表示提前结束本轮循环,而直接进入下一轮循环的条件测试
while CONDITION1;do
COMMNAD1
if CONDITION2;then
continue
fi
COMMNAD N
done
示例 : 求100以内的所有偶数之和
#!/bin/bash
declare -i evensum=0
declare -i i=0
while [ $i -le 100 ];do
let i++
if [ $[$i%2] -eq 1];then
continue
fi
let evensum+=$i
done
2、break
表示提前跳出循环
示例:100以内所有奇数之和
#!/bin/bash
declare -i evensum=0
declare -i i=1
while true;do
let $oddsum+=$i
let i+=2
if [ $i -gt 100 ];then
break
fi
done
3、while的特殊用法之遍历文件的行
while read VARIABLE;do
循环休
done < /path/form/somefile
4、for循环的特殊用法
for ((控制变量初始化;条件判断表达式;控制变量的修正语句));do
循环体
done
控制变量初始化:仅在循环代码开始运行时,执行一次
控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做判断
1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户centos登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。 #!/bin/bash # until [[ -z /var/log/login.log ]] ;do a=$(w|grep "centos"|awk ‘{print $2,$3}‘) b=$(w|grep "centos"|awk ‘{print $2}‘) echo "$a" > /var/log/login.log echo "please outlog" | write centos $b && echo "success" && exit sleep 3 done 2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出 #!/bin/bash # pan() { if [ $[RANDOM%11] -$1 5 ] ;then echo " congritulation,you win." echo "$[RANDOM%11]" elif [ $[RANDOM%11] -$2 5 ];then echo "sorry ,you lose." echo "$[RANDOM%11]" else echo "$[RANDOM%11]" exit fi } read -p "plesae guess big or small: " daxiao case $daxiao in big) pan gt le ;; small) pan le gt ;; *) echo "please input a small or big" ;; esac 5、编写脚本,打印九九乘法表 #!/bin/bash for i in `seq 1 9`;do for j in `seq 1 $i`;do echo -ne "${j}X${i}=$[i*j]\t" done echo done 6、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者 #!/bin/bash # min=$1 max=0 for M in {1..10};do magic=$magic" "$(echo $[RANDOM%$1]) let M++ done for I in `echo $magic` ;do if [ $min -ge $I ];then min=$I elif [ $max -lt $I ];then max=$I fi done echo $min echo $max echo -e "---the random list ----\n$magic" 7、编写脚本,实现打印国际象棋棋盘 #!/bin/bash # for i in `seq 1 $1`;do for j in `seq 1 $2`;do total=$[i+j] rev=$[total%2] if [[ "$rev" -eq 0 ]];then echo -en "\033[41m \033[0m" else echo -en "\033[47m \033[0m" fi done echo done 8、打印等腰三角形 #!/bin/bash # declare -i i i=1 until [ $i -gt $1 ];do while true;do for j in `seq 1 $[$1-i]`;do echo -ne " " let j++ done j=1 && break done for m in `seq $[$1-i+1] $[$1+i-1]`;do echo -ne "*" done echo let i++ done 9、安装centos6.7,用centos6.8kernel升级
本文出自 “mylinux” 博客,请务必保留此出处http://luxiangyu.blog.51cto.com/9976123/1839525
原文地址:http://luxiangyu.blog.51cto.com/9976123/1839525