shell脚本编程(小白学习3)

一、条件判断case语句

格式

[root@ansible-salve1 shell]# help case
case: case 词 in [模式 [| 模式]...) 命令 ;;]... esac
    基于模式匹配来执行命令。
    
    基于 PATTERN 模式匹配的词 WORD,有选择的执行 COMMANDS 命令。
    `|' 用于分隔多个模式。
    
    退出状态:
    返回最后一个执行的命令的状态。
[root@ansible-salve1 shell]# 

case支持glob风格的通配符

*: 任意长度任意字符
?: 任意单个字符
[]: 指定范围内的任意单个字符
|: 或,如a|b ,a或b

[root@ansible-salve1 shell]# vim info6.sh 
#!/bin/bash
read -p "Do you agree(yes/no)?" INPUT

INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`

case $INPUT in
y|yes)  
        echo "You input is Yes"
        ;;
n|no)
        echo "You input is No"
        ;;
*)      
        echo "Input fales,please input yes or no!"
esac  
[root@ansible-salve1 shell]# chmod +x info6.sh
[root@ansible-salve1 shell]# ./info6.sh 
Do you agree(yes/no)?yes
You input is Yes
[root@ansible-salve1 shell]# ./info6.sh 
Do you agree(yes/no)?no
You input is No
[root@ansible-salve1 shell]# ./info6.sh 
Do you agree(yes/no)?111
Input fales,please input yes or no!
[root@ansible-salve1 shell]# 

二、循环

2.1 循环执行介绍

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件

重复运行次数

*   循环次数事先已知
*   循环次数事先未知

常见的循环的命令:for,while

#循环的逻辑:程序先进行语句判断,如果为真则执行循环语句,然后再进行语句判断,直至语句判断失败才跳出

2.2for循环

格式1:

# 第一种写法
for NAME [in words ...]; do commands;done

# 第二种写法
for 变量 in 列表
	循环体
done

# 第三种写法
for 变量 in 列表
do
	循环体
done

执行机制:

依次将列表中的元素赋值给”变量名“;每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束

> 示例:

for循环列表生成方式

* 直接给出列表

* 整数列表

{start..end}
$(seq [start [step]] end)

返回列表的命令

$(COMMAND)

使用glob,如:\*.sh

变量引用,如: $@, $#,$* `位置参数`

示例:打印99乘法表

[root@localhost ~]# vim 99cheng.sh
[root@localhost ~]# ./99cheng.sh
1 x 1 = 1
1 x 2 = 2       2 x 2 = 4
1 x 3 = 3       2 x 3 = 6       3 x 3 = 9
1 x 4 = 4       2 x 4 = 8       3 x 4 = 12      4 x 4 = 16
1 x 5 = 5       2 x 5 = 10      3 x 5 = 15      4 x 5 = 20      5 x 5 = 25
1 x 6 = 6       2 x 6 = 12      3 x 6 = 18      4 x 6 = 24      5 x 6 = 30      6 x 6 = 36
1 x 7 = 7       2 x 7 = 14      3 x 7 = 21      4 x 7 = 28      5 x 7 = 35      6 x 7 = 42   7 x 7 = 49
1 x 8 = 8       2 x 8 = 16      3 x 8 = 24      4 x 8 = 32      5 x 8 = 40      6 x 8 = 48   7 x 8 = 56      8 x 8 = 64
1 x 9 = 9       2 x 9 = 18      3 x 9 = 27      4 x 9 = 36      5 x 9 = 45      6 x 9 = 54   7 x 9 = 63      8 x 9 = 72      9 x 9 = 81
[root@localhost ~]# cat 99cheng.sh 
#!/bin/bash
for i in `seq 1 9`
do
        for j in `seq 1 $i`
        do
                echo -e -n "$j x $i = $[i*j]\t"

        done
        echo
done

生产案例:将指定目录下的所有文件的后缀都进行备份

[root@localhost ~]# mkdir dir1
[root@localhost ~]# cd dir1/
[root@localhost dir1]# for i in doc pdf png txt jpg;do touch {1..10}.$i;done
[root@localhost dir1]# ls
10.doc  1.doc  2.doc  3.doc  4.doc  5.doc  6.doc  7.doc  8.doc  9.doc
10.jpg  1.jpg  2.jpg  3.jpg  4.jpg  5.jpg  6.jpg  7.jpg  8.jpg  9.jpg
10.pdf  1.pdf  2.pdf  3.pdf  4.pdf  5.pdf  6.pdf  7.pdf  8.pdf  9.pdf
10.png  1.png  2.png  3.png  4.png  5.png  6.png  7.png  8.png  9.png
10.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
[root@localhost dir1]# for i in $(ls /root/dir1);do echo ${i##*.} >> last.txt;done;cat last.txt | sort | uniq > last.bak
[root@localhost dir1]# cat last.bak
doc
jpg
pdf
png
txt
[root@localhost dir1]# 

将目录中YYYY-MM-DD中的所有文件移动到YYYY-MM/DD目录下


 [root@ansible-salve1 ~]# vim mkdir.sh 
#!/bin/bash
for i in {1..365};do
       DIR=`date -d "-$i day" +%F`
       mkdir /data/test/$DIR
       cd /data/test/$DIR
       for n in {1..10};do
	   touch $RANDOM.log
       done
done  

# 2.移动到YYYY-MM/DD下
 [root@ansible-salve1 ~]# mkdir mv.sh
#!/bin/bash
DIR=/data/test
cd $DIR
for DIR in *;do
   YYYY_MM=`echo $DIR | cut -d"_" -f1,2`
   DD=`echo $DIR |cut -d"_" -f3`
   [ -d $YYYY_MM/$DD ] || mkdir -p $YYYY_MM/$DD &> /dev/null
   mv $DIR/*  $YYYY_MM/$DD
done

双小括号方法,即((…))格式,也可以用于算术运算,双小括号方法也可以使用bash shell 实现C语言风格的变量操作l=10;((l++))

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
    循环体
done

说明:

*   控制变量初始化:仅在运行到循环代码段时执行一次
*   控制变量的修正表达式:每轮循环结束后会先进行控制变量修正运算,然后在做条件判断

示例:1到100的和

#!/bin/bash
sum=0
for i in {1..100} ;do
   let sum+=i
done
echo sum=$sum

sum=0
for ((i=1;i<=100;i++));do
        let sum+=i
done
echo sum=$sum                        

2.3 while循环

[root@ansible-salve1 shell]# help while
while: while 命令; do 命令; done
    只要测试成功即执行命令。
    
    只要在 `while' COMMANDS 中的最终命令返回结果为0,则
    展开并执行 COMMANDS 命令。
    
    退出状态:
    返回最后一个执行的命令的状态。
[root@ansible-salve1 shell]# 

格式:

while command; do commands;done

while condition;do 循环体 done

说明

shell
condition:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“Ture”,则执行一次循环;直到条件测试状态为“false”终止循环,因此:condition一般应该有循环控制变量;而此变量的值会在循环不断地被修正

进入条件:condition为True

退出条件:condition为False

无限循环

while true;do
    循环体
done

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值