条件选择if语句
if语句是选择执行的,条件满足则执行,不满足则退出,if语句也可嵌套,就是if语句里面也可以在进行if语句
单分支
if 判断条件;then
statement1
fi
双分支
if 判断条件;then
条件为真得分支
else
条件为假的分支
fi
多分支语句
if 判断条件1;then
if-true
elif 判断条件2;then
if-true
elif 判断条件3;then
if true
中间省略
else
all-false
fi
逐一对条件进行判断,第一次遇到为真的条件时,执行其分支,而后结束真个if语句
条件判断:case语句
case 变量引用 in
pattern1)
分支1
;;
pattern2)
分支2
;;
……
*)
默认分支
;;
esac
注意:每个分之后必须要跟两个分号,结束符是case的反写也就是esac,case也支持glob风格的通配符 *:任意长度的任意字符,?:任意单个字符,[]:指定范围内的任意单个字符
a|b:a或b
示例
1、 写一个脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
使用if的双分支语句来判断用户是否存在,如果存在就不执行添加用户,反之,则添加,并显示信息
#!/bin/bash
#
read -p "please input a username :" User
if [ id -u $User &>/dev/null ] ; then
echo "$User is exists…"
else
useradd $User
id $User
fi
2、 写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
这里使用到的是case语句,用户输入yes或no返回相应的信息,这里需要考虑脚本的健壮性,yes或no需要大小写随机组合也可以使Y|y|N|n等返回信息,这里可以使用通配符,但还有一种更简单的方法,就是使用tr命令将用户输入的不管大写小写,统统转换成小写即可
#!/bin/bash
#
read -p "please input (yes |no) :" A
case $A in
[yY]|[yY][eE][Ss])
echo "The user input a $A"
;;
[nN]|[[nN][oO])
echo "The user input a $A"
;;
*)
echo "The user input other message" ;;
esac
#!/bin/bash
#
read -p "please input (yes |no) :" A
case $A in
echo $A |tr 'A-Z' 'a-z'
y|yes)
echo "The user input a $A"
;;
n|no)
echo "The user input a $A"
;;
*)
echo "The user input other message" ;;
esac
3、 写一个脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
判断文件类型的前提是文件或目录需要事先存在,首先就要判断文件存在与否,存在则往下执行,否则退出
#!/bin/bash
#
read -p "please input a filepath:" File
[ ! -e $File ] && echo "$File is not exist " && exit 4
if [ -d $File ] ; then
echo "$File is a directory"
elif [ -h $File ] ;then
echo "$File is a link file "
elif [ -f $File ] ;then
echo "$File is a common file"
else
echo "$File is the other file…"
fi
4、 写一个脚本/root/bin/checkint.sh,判断用户输入的是否为正整数
使用变量来匹配字符串,匹配是否是属于正整数当中的某个数字,符合则显示为正整数,否则显示不是
#!/bin/bash
#
read -p "please input a number: " Num
if [[ "$Num" =~ ^[1-9][0-9]*$ ]] ;then
echo "The Num is a integer"
else
echo " The Num is not a integer"
fi
5、判断用户user是否存在,如果不在将其创建
if id user1&>/dev/null ;then
echo “user1 is exists..”
else
useradd user1
fi
循环
将某代码重复执行多少次,重复运行多少次,循环次数事先已知,循环次数实现未知,有进入条件和退出条件
shell的循环语句有如下几种:
for循环
for 变量名 in 列表 ;do
循环体
done
执行机制:依次将列表中的元素赋值给“变量名”,每次复制后执行一次循环体;知道列表中的元素耗尽,循环结束
列表生成方式
直接给出列表
整数列表 {start..end},$(seq [start [stop] end]起始值,步径,结束值
返回列表的命令$(command)
使用glob,如:*.sh
变量引用:
$@,$*(两者的区别在使用引号时,前者表示的不是一个整体,后者表示所有的位置变量是一个整体)
while
while 条件判断;do
循环体
done
条件判断:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为true,则执行一次循环;知道条件测试状态为false终止循环,因此条件判断一般有循环控制变量;而此变量的值会在循环体不断被修正
进入条件:判断条件为true
退出条件:判断条件为false
until
until 条件判断;do
循环体
done
进入条件:判断条件 为false,刚好跟for,while相反
退出条件:判断条件为true
示例:
1、 /etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以k开头的文件输出为文件加stop ,以S开头的文件输出为文件名加start;
#!/bin/bash
for i in `ls /etc/rc.d/rc3.d/` ; do
if [[ $i =~ ^S.* ]] ;then
echo “$i start”
elif [[ $=~^K.* ]] ; then
echo “$i stop “
else
echo “unknow file”
fi
done
2、写一个脚本,提示输入正整数n的值,计算1+2+3+…n的总和
方法一:使用for循环
#!/bin/bash
declare i=1
declare -i sum=0
read –p “please input a number:’ Num
for i in [ 1 $Num ] ; do
let sum+=$i
done
echo $sum
方法二:使用while循环
#!/bin/bash
#
declare –i sum=0
declare –I i=1
whle [ $i –le 100 ];do
let sum+=$i
let i++
done
echo “The sum is $sum”
方法三:使用until循环
#!/bin/bash
#
declare –i i=0
until [ $i –gt 100 ] ;do
let sum+=$i
let i++
done
echo “The sum is $sum”
3、 写一个脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
方法一:使用for循环
#!/bin/bash
#
read –p “please input a ipv4 address: “ IP
A=`echo $IP |cut -d . –f1-3`
for I in {1..255}
if ping -c1 –W1 $A.$i &>/dev/null; then
echo “$A.$i is up “
let up++ #计算能ping通的主机数量
else
echo “$A.$i is down”
let down++ #计算不能ping通的主机数量
fi
done
echo “The host $A.$i has $up up”
echo “The host $A.$i has $down down”
方法二:使用while循环
#!/bin/bash
#
declare –I i=0
while [ $i –le 254 ];do
if ping -c1 –W1 10.1.252.$i &>/dev/null ;then
echo “10.1.252.$i is up “
let up++
else
echo “10.1.252.$i is down “
let down ++
fi
let i++
done
echo “The host $A.$i has $up up”
echo “The host $A.$i has $down down”
方法三:使用until循环
#!/bin/bash
#
declare –I i=0
until [ $i –gt 254 ];do
if ping -c1 –W1 10.1.252.$i &>/dev/null ;then
echo “10.1.252.$i is up “
let up++
else
echo “10.1.252.$i is down “
let down ++
fi
let i++
done
echo “The host 10.1.252.$i has $up up”
echo “The host 10.1.252.$i has $down down”
4、 打印九九乘法表
使用循环依次打印,首先得有9行,定义一个变量取值范围的1-9,然后就是列,找出99乘法表的规律,比如我行的初始值是1,那么我第一列只打印一个公式,列的取值范围是小于行的数,依次循环,当我行的值8是,那么我的列的取值范围也是1-8,内循环,从1*8,内部循环第一结束之后,列的数依次加一循环,当列的值大于行的值时,就退出内部循环,行的值再来加一,一直加到行的值大于9就停止循环
方法一:使用for循环
for循环实现
#!/bin/bash
#
for i in {1..9};do
for a in $(seq 1 $i) ;do
echo –en “${a}x${i}=$[a*i]\t”
done
echo
done
方法二:使用while循环
#!/bin/bash
#
declare –I i=1
while [ $i –le 9 ];do
declare –I a=1
while [ $a –le $i ];do
echo -ne "${a}x${i}=$[a*i]\t"
let a++
done
echo
let i++
done
方法三:使用until循环
#!/bin/bash
#
declare –I i=1
until [ $i –gt 9 ];do
declare –I a=1
until [ $a –gt $i ];do
echo -ne "${a}x${i}=$[a*i]\t"
let a++
done
echo
let i++
done
5、 利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者
首先定义最大值和最小值相等,之后随即生成一个数字,将最大值与随机数作比较,如果随机数大于最大值,将随机数的值赋给最大值,那么最小值也是如此,将最小值与随机数作比较,如果随机数的值小于最小值,将随机数的值赋给最小值,最终最大值和最小值也就出来了
#!/bin/bash
#
max=$RANDOM
min=$max
for I in {1..10};do
rdm=$RANDOM
echo –ne “$rdm\t”
if [ $rdm –gt $max ] ; then
max=$rdm
elif [ $rdm –lt $min ] ;then
min=$rdm
fi
done
echo
echo “The max number is $max”
echo “The min number is $min”
方法二:使用while循环
#!/bin/bash
#
declare –I i=1
while [ $i le 10] ;do
rdm=$RANDOM
echo –ne “$rdm\t”
if [ $i –eq 1 ] ;then
max=$RANDOM
min=$max
if [ $rdm –gt $max ] ; then
max=$rdm
elif [ $rdm –lt $min ] ;then
min=$rdm
fi
done
echo
echo “The max number is $max”
echo “The min number is $min”
方法三:使用until循环
#!/bin/bash
#
declare –I i=1
until [ $i –gt 10 ] ;do
rdm=$RANDOM
echo –ne “$rdm\t”
if [ $i –eq 1 ] ;then
max=$RANDOM
min=$max
elif [ $rdm –gt $max ] ; then
max=$rdm
elif [ $rdm –lt $min ] ;then
min=$rdm
fi
done
echo
echo “The max number is $max”
echo “The min number is $min”
6、 打印国际象棋棋盘
方法一:使用for循环
国际棋盘的规律就是,颜色是交替出现的,这时可以用奇偶数来进行判断,当行和列取模作差运算等于就说明是偶数,打印一个颜色,如果为奇数打印另一种颜色,颜色的控制利用空格加背景色来控制
#!/bin/bash
#
for in in {1..10}; do
for a in {1..10};do
if [ $[a%2 – i%2 ] –eq 0 ] ;then
echo -ne "\033[40m \033[0m"
else
echo echo -ne "\033[42m \033[0m"
fi
let a++
done
echo
let i++
done
方法二:使用while循环
#!/bin/bash
#
declare –I i=1
while [ $i –le 10 ]; do
declare –I a=1
while [ $a –le 10 ];do
if [ $[a%2 – i%2 ] –eq 0 ] ;then
echo -ne "\033[40m \033[0m"
else
echo echo -ne "\033[42m \033[0m"
fi
let a++
done
echo
let i++
done
7、 每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。
#!/bin/bash
#
a=`who |grep "^hacker\>" |tr -s ' ' '%' |cut -d % -f3-4|tr '%' ' '`
tty=`who |grep "^hacker\>"|awk -F ' ' '{print $2}'`
host=` who |grep "^hacker\>" |cut -d \( -f2|cut -d \) -f1`
until false ; do
who |grep "^hacker\>"
if [ $? -eq 0 ] ; then
echo "$a\n$host" |write hacker $tty
fi
sleep 3
done
8、 随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
#!/bin/bash
#
declare -i i=0
read -p "please input a number:" Num
until [ $Num -gt 10 ] ;do
a=`echo $[RANDOM%11]`
lif [[ $Num -gt $a ]] ;then
echo "upper"
exit 3
elif [[ $Num -lt $a ]];then
echo "lower"
exit 4
elif [[ $Numb -eq $a ]];then
echo "your are write"
exit 5
fi
done
9、打印等腰三角形
找出 等腰三角形的规律,下面一行跟上面的一行,相差2个字符,于是公式就是行数*2-1,这里还要控制前面的空白字符,不然打印出来的就不是等腰三角形,还需要找出空白字符的规律,空白字符的规律是总的行数减去当前行数得出的就是空白的字符数
#!/bin/bash
#
read -p "please input a number " n
for i in `seq $n`; do
for a in `seq $[$n-$i]`;do
echo -n " "
done
for b in `seq $[ i*2-1 ]`;do
echo -n "#"
done
echo
done
总结:上面的各种例子当中,都是用到循环来使用,有时也需要用if条件判断,以达到最终实现要表现的效果,所以要熟悉掌握使用各种循环之间的嵌套
原创文章,作者:fszxxxks,如若转载,请注明出处:http://www.178linux.com/37328