深入浅出Linux-Shell编程[四】

举报
Maynor学长 发表于 2022/09/20 19:43:49 2022/09/20
【摘要】 ​4、Shell 分支case语句case 语句和 if...elif...else 语句一样都是多分支条件语句,  不过和多分支 if 条件语句不同的是,  case 语句只能判断 一种条件关系,  而 if 语句可以判断多种条件关系。1、case 语法格式case 变量名  in值1)如果变量的值等于值1则执行指令1;;值2)如果变量的值等于值2则执行指令2;;值3)如果变量的值等于值3...


4Shell 分支case语句





case 语句和 if...elif...else 语句一样都是多分支条件语句,  不过和多分支 if 条件语句不同的是,  case 语句只能判断 一种条件关系,  而 if 语句可以判断多种条件关系。



1case 法格式







case 变量名  in

1)

果变量的值等于值1则执行指令1

;;

2)

果变量的值等于值2则执行指令2

;;

3)

果变量的值等于值3则执行指令3

;;

*)

如果量的值不等于以上列出的任何值则执行默认指令

esac



2case 句的使用总结




case 语句比较适合变量值较少且为固定的数字或字符串集合情况(非不确定的内容,  例如范围),  如果变量的值 知固定的start/stop/restart等元素,  那么采用case语实现就比较适合

case主要是写服务的启动脚本,  一般情况下,  传参不同且具有少量的字符串,  其适用范围窄

if就是取值判断、比较、应用比case更广。几乎所有的case语句都可以用if条件语句实现



   case语句就相当于多分支的if/elif/else语句,  但case语句的优势是更规范、

3case 语句案例

1判断输入内容

1.apple
2.pear
3.banana
4.cherry
# 当用户输入对应的数字选择水果的时候,  告诉他选择的水果是什么,  并给水果单词加上一种颜色  (随意)  ,  要求用 case语句实现。
[root@qfedu.com ~]# cat fruit.sh
#!/bin/bash
##############################################################
# File Name: fruit.sh
# Version: V1.0
# Author: qfedu
# Organization:
# Created Time :
# Description:
##############################################################
cat <<EOF
1.apple
2.pear
3.banana
4.cherry
EOF
read ‐p "请输入您的选择:" num
red="\033[31m"
green="\033[32m"
yewllo="\033[33m"
blue="\033[34m"
tailer="\033[0m"
case $num in
1)
echo ‐e "$red apple $tailer"
;;
2)
echo ‐e "$green pear $tailer"
;;
3)
echo ‐e "$yewllo banana $tailer"
;;
4)
echo ‐e "$blue cherry $tailer"
;;
*)
echo "Usage:$0{1 |2 |3 |4}"
exit 1
esac






2判断输入执行输入指令

[root@qfedu.com ~]# cat rsync.sh
#!/bin/bash
##############################################################
# File Name: rsync.sh
# Version: V1.0
# Author: qfedu
# Organization:
# Created Time :
# Description:
##############################################################
. /etc/init.d/functions
# rsyncd进程号路径
rsyncd_pid_path=/var/run/rsyncd.pid
# 创建锁文件
lockfile=/var/lock/subsys/rsyncd
start() {
if [ ! ‐f $rsyncd_pid_path ]
then
rsync ‐‐daemon
retval=$?
if [ $retval ‐eq 0 ]
then
action "rsync is start ok" /bin/true
touch $lockfile
return $retval
else
action "rsync is start fail" /bin/false
return $retval
fi
else
echo "rsync in runing.."
fi
}
stop() {
if [ ‐f $rsyncd_pid_path ]
then
rsyncd_pid=`cat $rsyncd_pid_path`
#判断进程是否存在
if (kill ‐0 $rsyncd_pid &>/dev/null)
then
kill $rsyncd_pid
retval=$?
if [ $retval ‐eq 0 ]
then
action "rsync is stop ok" /bin/true
rm ‐f $lockfile
return $retval
else
action "rsync stop fail" /bin/false
return $retval
fi
fi
else
echo "$rsyncd_pid_path is not exist or rsyncd does not startup"
fi
}

case $1 in
start)
start
retval=$?
;;
stop)
stop
retval=$?
;;
restart)
stop
retval=$?
sleep 1
start
retval=$?
;;
*)
echo "Usage:$0{start|stop|restart}"
exit 1
esac
exit $retval




二、Shell 编程之循环结构






1Shell 循环 for 






for循环的运作方式,  是讲串行的元素意义取出,  依序放入指定的变量中,  然后重复执行含括的命令区域  (在do

done 之间)  ,  直到所有元素取尽为止。

其中,  串行是一些字符串的组合,  彼此用$IFS所定义的分隔符  (如空格符)  隔开,  这些字符串称为字段。



1for 循环的语法结构





for 变量  in 值集

do

执行命

done



2for 语法说

   for  每次从值集合中取一个值赋值给变量

   do - done 将赋值后的变量带入执行的命令得到执行结果,

  重复以上两个步骤,  直到值集合中的值被一一获取赋值给变量的到所有结果,  循环结束

3、实例

1 for 循环创建 demo1-demo10,  然后在 demo1-demo10 创建 test1-test10 的目录












#!/bin/bash

for a in {1..10}

do

mkdir /datas/demo$a

cd /datas/demo$a

for b in {1..10}

do

mkdir test$b

done

done


#!/bin/bash

for k in $( seq 1 10 )    # seq  a b   用于产生从  a 到  b 之间的所有整数

do

mkdir /root/demo${k}

cd  /root/demo${k}

for l in $( seq 1 10 )

do

mkdir test${l}

cd  /root/demo${k}

done

cd ..

done






#!/bin/bash

DIR="/var"

cd $DIR

for k in $(ls $DIR)

do

[ d $k ] && du sh $k done




# /var目录中每一个文件,  进行for循环处理

# 如果/var下的文件是目录,  则使用du ‐sh计算该目录占用磁盘空间的大小



2Shell 循环 while 语句

1while 循环语法结构






while 条件测试

do

执行命

done



2while 语法说明

while 首先进行条件测,  如果传回值为0  (条件测试为真)  ,  则进入循环,  执行命令区域,  否则不进入循环 满足 while 测试条件,  执行命令区域,  直到 while 的测试条件不满足结束执行while循环  (如果条件一直满足 执行无穷循环)  

3、实例1while 循环读取文件的内容











#!/bin/bash

while read a

入循环,  显示读取到的内容

do

echo $a

done < /datas/6files


# 使用read有标准输入取数据,  赋值变量  demo 中,  如果读到的数据非空,  就

#!/bin/bash

while read demo

do

echo ${demo}

done < /home/scripts/testfile  # 将  /home/scripts/testfile 的内容按行输入给  read 读取



4、实例2while 条件测试





#!/bin/bash     declare i i=1  declare i sum=0 while ((i<=10)) do

let sum+=i

let i++

done

echo $sum


# 设置  i 和  sum为整数型

# while 条件测试:  只要i值小于或者等于10,  就执行循环

# sum+=i 和  sum=sum+i 一样的,  sum累加上i

# let i++,  i 的值递增  1,  此行是改变条件测试的命令,  一旦  i 大于10,  可终止循环 # 遇到  done  回到 while 条件测试

# 直到 while 条件不满足,    显示  sum 的值







4、实例3 while 99 乘法表





#!/bin/bash

a=1

=1

while ((a <=9))

do

while ((b<=a))

do

let "c=a*b"            # 声明变量c

echo n  "$a*$b=$c "   # echo 输出显示的格式,  n不换行输出

let b++

done

let a++

let b=1  # 因为每个乘法表都是1开始乘,  所b要重置

echo ""   # 显示到屏幕换行

done



3Shell 循环 until 语句

   while循环条件测试是测真值,  until循环则是测假值。

1  until 循环的语法结构








until 条件测试

do

执行命

done



2  until 语法说明




until 条件测结果为假  (传回值不为0)  ,  就进入循环。

条件测试不满足,  执行命令区域。直到 until 条件满足,  结束执行until 循环  (如果条件一直不满足则执行无穷 环)  。



3、实例1 until 单层条件测试





#!/bin/bash     declare i i=10 declare i sum=0 until ((i>10))  do

let sum+=i

let ++i

done

echo $sum


# 声明isum为整数

# 条件测:  只要i值未超过10,  就进入循环

# sum+=isum=sum+i是一样的,  sum累加上i

# i的值递增1,  此行是改变条件测试的命令,  一旦i大于10,  可终止循环

# 遇到done,  回到  until条件测试

# 直到  until 的条件满足显示sum的值



4、实例2 until 双层条件测试











4Shell 循环控制

1Shell 循环控制说明

   break,  continue,  exit 一般用于循环结构中控制循环的走向。







break  n

n 表示跳出循环的次数,  如果省略 n 表示跳出整个循环

continue

n

n 表示退到第n层继续循环,  如果省略n表示跳过本次循环进入下一次

exit  n

退出当前的shell程序,  并返回 n,  n 也可以省略

return

用于回一个退出值给调用的函数

shift

用于将参数列表list左移指定次数,  最左端的那个参数就从列表中删除,  其后边的参数继续进 入循环




2  break 指令

   break[N]:  提前结束第N层循环,  最内层为第1






while CONDITION1; do

CMD1

...

if CONDITION2; then

break

fi

CMDn

...

done

continue:  提前结束本次循环,  提前进入下一轮循环,  continue 2 跳出本次内层循环,  进入外层循环

break  结束本次循环  (整个)  ,  退出脚本




  实


[root@qfedu.com  ~]#vim test.sh

#!/bin/bash

for i in {1..10}

do

[ $i eq 5 ] && break

echo i=$i

sleep 0.5

done

echo test is finished


[root@qfedu.com  ~]#chmod +x test.sh

[root@qfedu.com  ~]#./test.sh

i=1

i=2

i=3

i=4

test is finished



[root@localhost ~]# cat break1.sh

#!/bin/bash

for((i=0;i<=5;i++))

do

if [ $i eq 3 ];then

break;

fi

echo $i

done

echo "ok"

# 运行结果为:

[root@localhost ~]# bash break1.sh

0

1

2

ok



3continue 指令

   continue [N]:  提前结束第N层的本轮循环,  而直接进入下一轮判断;  最内层为第1










  实


[root@localhost ~]# cat continue.sh

#!/bin/bash

for((i=0;i<=5;i++))

do

if [ $i eq 3 ];then

continue;

fi

echo $i

done

echo "ok"

#运行结果为

[root@localhost ~]# bash continue.sh

0

1

2

4

5

ok



[root@qfedu.com  ~]#vim test.sh

#!/bin/bash

for i in {1..10}

do

[ $i eq 5 ] && continue

echo i=$i

sleep 0.5

done

echo test is finished


[root@qfedu.com  ~]#./test.sh

i=1

i=2

i=3

i=4

i=6

i=7

i=8

i=9

i=10

test is finished



4exit 指令




  实







5shift 指令




shift 命令用于将参数列表 list 左移指定次数,  最左端的那个参数就从列表中删除,  其后边的参数继续进入循 环。

shift[N]:  用于将参量列表 list 左移指定次数,  缺省为左移一次。

参量列表 list 一旦被移动,  最左端的那个参数就从列表中删 除。while 循环遍历位置参量列表时,  常用到 shift

实例








1shift 指令实例:  创建指定的多个用户

  实






#!/bin/bash

if [ $# eq 0 ];then

echo "请在脚本后输入参数  (例如:  $0 arg1)  "

exit 1

else

while [ n "$1" ];do

useradd $1

echo 123 |passwd ‐‐stdin $1

shift

done

fi



2、运行结





[root@qfedu.com  ~]# bash test.sh a1 a2 a3

更改用户  a1 的密码  。

passwd:  所有的身份验证令牌已经成功更新。

更改用户  a2 的密码  。

passwd:  所有的身份验证令牌已经成功更新。

更改用户  a3 的密码  。

passwd:  所有的身份验证令牌已经成功更新。

分析:  如果没有输入参数  (参数的总数为0)  ,  提示错误并退出;  反之,  进入循环;  若第一个参数不为空字符,   创建以第一个参数名的用户,  并移除第一个参数,  将紧跟的参数左移作为第一个参数,  直到没有第一个参数,  退 出。



3打印直角三角形的字符

  实






#!/bin/bash

while (($# > 0));do

echo "$*"

shift

done






[root@qfedu.com  ~]# bash test1.sh 1 2 3 4 5 6 7

1 2 3 4 5 6 7

2 3 4 5 6 7

3 4 5 6 7

4 5 6 7

5 6 7

6 7

7




【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。