分支循环
一、if分支
案例1:
TYPE=$1 # 以防不识别,用一个变量接收
if [ $1 == "start" ]
then
echo "start ..."
elseif [ $1 == "stop" ]
then
echo "stop ..."
elseif [ $1 == "restart" ]
then
echo "restart ..."
else
echo "not support : $1"
案例2:
长度匹配
if [ $# -eq 0 ]
then
echo "need one argument"
exit 0
fi
TYPE=$1
if [ $TYPE == "start" ]
then
echo "start ... "
elif [ $TYPE == "stop" ]
then
echo "stop ... "
elif [ $TYPE == "restart" ]
then
echo "restart ... "
else
echo "not support : $1"
fi
#exit 0 : 结束shell脚本,后面的数字可加可不加
#跟Java中的system.exit很类似
二、case分支
case $1 in
1|3|5)
echo "南京烤鸭 ¥28"
;;
2|4)
echo "郭阿姨月亮馍 ¥10"
;;
6|7)
echo "驴肉火烧 ¥30"
;;
*) #相当于default
echo "非法星期 $1"
;;
esac #结束符
三、字符串转数组测试
将符合数组特性的字符串转为数组
##取出自己的元素
V="henrry pola ariel"
echo ${V[0]}
V="henrry pola ariel"
V=($V) #转换成数组
echo ${V[0]} #取第一个元素
##可以试着把提取的位置换成1 、2
##换成*或者@,则是提取所有元素
四、for循环
V="henrry poal ariel "
V=($V)
for var in ${V[*]}
do
echo $var
done
五、while循环
V="henrry pola ariel"
V={$v}
IX=0
while [ $IX -lt ${$V[*]} ] #下标小于数组长度
do
echo ${V[$IX]}
((IX++))
#两种不同的表现形式,都可以实现自加的效果
#$IX=`expr $IX + 1`
done
六、until循环
当不满足条件就执行后面的操作
条件为假就进入循环;条件为真就退出循环
#输出1-10
IX=1
until [ !$IX -le 10 ] #当IX小于等于10的条件为假时,执行循环
do
echo $IX
((IX++))
done
while 和 until 的区别
while是当条件成立的时候
until是当条件不成立的时候
IX=1
until [ $IX -gt 10 ]
do
echo $IX
((IX++))
done
七、seq序列
seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式、宽度、分割符号进行控制
#最适合用来做菜单
语法:
[1] seq [选项] 尾数
[2] seq [选项] 首数 尾数
[3] seq [选项] 首数 增量 尾数
#序列seq文件目录
select choice in start stop restart
do
case $choice in
start)
echo "start ..."
;;
stop)
echo "stop ..."
;;
restart)
echo "restart ..."
;;
*)
echo "not support ..."
;;
esac
done
#尝试加入exit退出脚本
#序列seq文件目录
select choice in start stop restart exit
do
case $choice in
start)
echo "start ..."
;;
stop)
echo "stop ..."
;;
restart)
echo "restart ..."
;;
exit)
echo "exited ..."
exit 0
*)
echo "not support ..."
;;
esac
done
序列
#第一个代表初始值 第二个代表步幅 第三个表示终点值
for var in `seq 1 2 100`
do
echo $var
done
#截取部分
#2个数默认为初始值和终点值
for i in `seq 1 100`
do
echo $i
done
八、break&continue
for i in `seq 1 10`
do
b=$(((i-1)*50))
e=$((i*50))
echo "$b $e"
done
求和
#当sum+sum2=5000的时候,sum1,sum2,i,j,rst分别是多少
#求和
sum1=0;sum2=0
for i in `seq 1 10`
do
b=$(((i-1)*50+1))
e=$((i*50))
for j in `seq $b $e`
do
rst1=$(($j%3))
rst2=$(($j%7))
rst3=$(($rst1*$rst2))
if [ $rst3 -ne 0 ]
then
continue
fi
if [ $rst1 -eq 0 ]
then
((sum1+=$j))
fi
if [ $rst2 -eq 0 ]
then
((sum2+=$j))
fi
rst=$(($sum1+$sum2))
if [ $rst -ge 5000 ]
then
echo "i=$i,j=$j,sum1=$sum1,sumn2=$sum2,$rst=$rst"
break 2 #跳出2层循环
fi
done
done
跳转语句
break 跳出第n层循环,默认为1
continue 继续第n层循环,默认为1
九、案例
1、水仙花数
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
#第一种写法
for i in `seq 100 999`
do
t=$i
sum=0
while [ $t -ge 1 ]
do
((sum+=($t%10)**3))
((t/=10))
done
if [ $sum -eq $i ]
then
echo $i
fi
done
#第二种写法(更基础,容易写出来)
for i in `seq 100 999`
do
a=$(($i/100))
b=$(($i/10%10))
c=$(($i%10))
rst=$(($a**3+$b**3+$c**3))
if [ $rst -eq $i ]
then
echo $i
fi
done
2、小九九
for i in `seq 1 9`
do
for j in `seq 1 $i`
do
echo -n "$j*$i="$((i*j))" " #双引号中间空格指的是每个式子之间有空格
done
echo
done
十、测试单引号双引号对转义符的影响
符合要求的只有一种能够达到转移的效果
从上面的代码测试中可以看出
"" #双引号中屏蔽\
'' #单引号中屏蔽$
由此可以对上面的小九九代码优化
for i in `seq 1 9`
do
for j in `1 $i`
echo "$j*$i"=$((i*j))$'\t'
done
echo
done
十一、日期
获取当前时间,不同的格式
(1)DATE = date + “%Y-%m-%d %H:%M:%S” #2020-11-24 20:11:57
最外层要套上倒引号``
(2)DATE = date + “%Y-%m-%d %X” #2020-11-24 08:11:57 PM
(3)DATETIME = date +%S #date日期至今多少秒
日期格式化
date -d date +”FORMAT”
十二、变量代替
${var:-value} 如果var值未设值或者值为空,表达式的值为value,var的值不变
${var:=value} 如果var未设值或者值为空,表达式的值为value,var的值为value
${var:-value} 可以理解成var后面的是默认值,如果var有值就显示var的值,没有就显示默认值value
${var:=value} var未设值或者值为空,表达式的值为value,var的值为value
十三、命令代替
OUTPUT=`command` 先执行命令,等到命令执行结束,将结果值赋给OUTPUT后,才会执行之后的命令
除非启动的是后台进程