一、条件判断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
33万+

被折叠的 条评论
为什么被折叠?



