shell脚本:if判断、case语句、循环、函数、数组
if判断
if语句分为单分⽀、双分⽀、多分枝。如果判断前⾯执⾏的命令成⽴则执⾏后⾯的命令,通常与test测试⼀起使⽤,if判断的标准是if执⾏的命令的返回值是否为0,当命令执⾏成功时返回⼀个0,如果不成功返回⼀个⾮0实数,返回值可以通过echo $?查看,返回值也可以⼿动修改。
if[ a < b ]单分⽀,如果返回值为0也就是if后的命令执⾏成功,那么执⾏echo 1
then
echo 1
fi
if[ a == b ]双分⽀,如果返回值为0执⾏echo 2,不为0执⾏echo 3
then
echo 2
else
echo 3
fi
if[ a > b ]多分⽀,如果返回值为0执⾏echo 4,不为0交给下⼀个elif进⾏判断,返回值为0则执⾏echo 5,不为0执⾏echo 6
then
echo 4
elif
echo 5
else
echo 6
fi
在if多分⽀中,对if后执⾏的命令进⾏判断,然后按照elif的顺序依次进⾏判断,最后得出结果,elif可以有任意个数,想创建多少个创建多少个。
if语句的应⽤
read -p "请输⼊ip地址或域名:"IP检查某个ip地址是否能连通,如果能ping通,显⽰is up 如果ping不通,显⽰is down
ping -c 5 $IP>>/dev/null
if[ $?-eq 0]
then
echo is up
else
echo is down
fi
read -p "请输⼊⽤户名:"USER查看某个⽤户是否存在,如果存在就显⽰已存在,不存在就创建该⽤户
id $USER&>>/dev/null
if[ $?-eq 0]
then
echo "已存在"
else
useradd $USER&>>/dev/null
echo "123"| passwd --stdin $USER&>>/dev/null
echo "⽤户已建⽴"
fi
read -p "请输⼊年份:"YEAR查看某⼀年是不是闰年,这⾥的思路是如果某⼀年的天数是366天,那么是闰年,如果是365天,那么不是闰年
year=`date -d "$YEAR"1231 +%j`  date -d "$YEAR"1231+%j是显⽰12⽉31⽇是今年的第⼏天
if[ $year -eq 366]
then
echo ""$YEAR"是闰年"
else
echo ""$YEAR"不是闰年"
fi
case语句
read -p "请输⼊想要操作的服务:" system  控制服务的重启,停⽌,启动
read -p "请输⼊想要进⾏的操作(英⽂):" operate
case $operate in
start)
systemctl start "$system";echo "服务已启动";;
restart)
systemctl restart "$system";echo "服务已重启";;
stop)
systemctl stop "$system";echo "服务已停⽌";;
esac
systemctl status "$system"显⽰这个服务的状态
read -p "⽯头剪⼑布:" mora    ⽯头剪⼑布的⼈机对战这⾥是case中嵌套if
if[ $mora ==布]思路是将随机数$RANDOM进⾏除以3得余数,得出0,1,2,给0,1,2定义⽯头剪⼑和布,并赋予⾃⼰输⼊的⽯头剪⼑布0,1,2的值,然后对值进⾏⽐⼤⼩
then          有些⼈可能会考虑到随机数每次都随机取值⽆法对值进⾏固定,所以要通过⼀个变量来将随机数的值进⾏固定
bu=2⽤变量固定随机数的值后,除⾮再次对变量进⾏赋值,否侧⼀直是这个值
elif [ $mora ==⽯头]
then
bu=1
elif [ $mora ==剪⼑]
then
bu=0
fi
jiandao=`echo $[$RANDOM%3]`
case $mora in
0)
if[ $bu -eq 0]
then
echo "平局"
elif [ $bu -eq 1]
then
echo "获胜"
elif [ $bu -eq 2]
then
echo "失败"
fi
;;
1)
if[ $bu -eq 0]
then
echo "失败"
elif [ $bu -eq 1]
then
echo "平局"
elif [ $bu -eq 2]
then
echo "获胜"
fi
;;
2)
if[ $bu -eq 0]
then
echo "获胜"
elif [ $bu -eq 1]
then
echo "失败"
elif [ $bu -eq 2]
then
echo "平局"
fi
;;
esac
for循环
for循环对⼀个变量的不同值分别执⾏⼀次命令,当把变量的不同值全部带⼊并执⾏⼀次后,循环结束,for循环有多种写吧,每种写法在⼤致的意思⼀样,但是在细节表⽰上不完全相同,有⼀点需要注意,for循环只是对变量的不同值执⾏命令,执⾏的命令可以没有这个变量,与变量的值没有⼀点关系,虽然通常都需要使⽤到前⾯的变量。for中可以嵌套其他语句。
for循环的格式
第⼀种:
for i in123或for i in{1..3}当i=1,i=2,i=3执⾏下⾯的命令,{1..3}这⾥的..表⽰1到3
do
命令序列
done
第⼆种:
for i in`seq 214`  seq 3表⽰从1开始直到214,每个数字都带⼊前⾯的变量⼀次
do
命令序列
done
第三种:
for((i=1;i<=214;i++))⾸先给i定⼀个初始值,然后对i进⾏判定,如果i的值符合判定则执⾏下⾯的命令,执⾏完后,i++直到判定不符合,循环完毕
do
命令序列
done
for循环的应⽤
read -p "输⼊菱形的规格:" ling  制作菱形
for((i=1;i<=$ling;i++))
do
for((j=$ling;j>i;j--))
do
echo -en " "
done
for((n=1;n<=$i;n++))
do
echo -en "* "
done
echo
done
for((i=1;i<=$ling;i++))
do
for((j=1;j<=$i;j++))
do
echo -en " "
done
for((n=$ling;n>i;n--))
do
echo -en "* "
done
echo
done
for((a=1;a<10;a++))制作99乘法表
do
for((b=1;b<=a;b++))
do
c=$[a*b]
echo -en ""$a"x"$b"="$c"\t"
done
echo
done
while循环
对⼀个条件进⾏判断,如果判定通过则执⾏命令,执⾏完后,返回while继续进⾏判定,如果不成功则循环结束。
while循环格式
while进⾏的判定⽐如[5-lt 10]
shell脚本返回执行结果
do
命令
done
while循环的应⽤
#!/bin/bash
i=1
sum=0
while[ $i -le 100]求100以内的偶数和
do
if[$((i%2))-eq 0];then
let sum=$i+$sum
fi
let i++
done
echo $sum
函数
函数实际上相当于在命令外⾯套了⼀层壳,然后给这层壳定义⼀个名字,对这个名字进⾏调⽤的时候会执⾏⾥⾯的命令,有点类似于别名,通常⽤于某些命令要重复多次写⼊时,定义⼀个函数名来减少⼯作量。函数没有什么⼤的注意事项,唯⼀需要注意的是在函数种使⽤位置变量的时候。
当我们使⽤位置参数执⾏脚本时,此时,位置参数的作⽤范围是这个脚本,⽽脚本中的函数并不感知,所以可能有些时候写脚本执⾏的时候会报错。所以如果要使⽤位置参数,不仅执⾏脚本后⾯要跟位置参数,调⽤函数时,后⾯也要添加位置参数。
如果出现相同函数名时,前⾯的函数会被后⾯的函数覆盖掉
关于函数中的变量,函数⾥的变量尽量不跟脚本⾥的变量相同,不然会可能会发⽣冲突等等,如果硬要写成同⼀个变量,在函数中变量的前⾯加上local,表⽰这是⼀个本地变量,只在函数中应⽤。
函数中也可以嵌套函数,也可以通过source 或者.调⽤其他脚本中的函数。
函数的格式
函数名(){应⽤的时候把对应的命令替换成函数名就⾏了
命令序列
}
数组
数组,就是多个元素组成的⼀个合集,数组通常运⽤于循环中。
a=(12345)定义⼀个数组
declare -a  查看所有数组,数组的下标是从0开始的
echo ${a[1]}将数组中的元素打印出来
echo ${a[*]}将数组中所有的元素打印出来
echo ${#a[@]}查看数组有多少个元素
echo ${!a[@]}查看数组的每⼀个元素的下标
echo ${a[*]:1:3}从第⼏个元素开始往后取多少个元素
a[3]=asd  通过这种⽅式更改数组中的元素
unset a[4]删除数组中的第五个元素

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。