shell分支循环

一、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后,才会执行之后的命令
除非启动的是后台进程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值