case:
如果变量的值满足的是 值1,执行命令1;如果不满足,继续向下匹配值2,执行命令2,… …
#!/bin/bash
read -p "请输入成绩:" s
if [ $s -gt 100 -o $s -lt 0 ]
then
echo "成绩不和规定。"
else
case $s in
9[0-9]|100)
echo "A"
;;
8[0-9])
echo "B"
;;
7[0-9])
echo "C"
;;
6[0-9])
echo "D"
;;
[0-9]|[0-5][0-9])
echo "E"
;;
esac
fi
[root@www shell]# ./chengji.sh
请输入成绩:44
E
[root@www shell]# ./chengji.sh
请输入成绩:79
C
[root@www shell]# ./chengji.sh
请输入成绩:80
B
[root@www shell]# ./chengji.sh
请输入成绩:11111
成绩不和规定。
for循环:
for 变量 in [ 取值列表 ]
do
done
以此比较$@ 和 $*
可以看出 $@ 是分开计算的,每一个都是独立的参数。
而 $ *则是整体计算的,算1个参数。
[root@www shell]# ./for.sh 1 2 3 4 5
1
2
3
4
5
共输入了 5 个参数。
1 2 3 4 5
共输入了 1 个参数。
[root@www shell]# cat for.sh
#!/bin/bash
i=1
for i in "$@"
do
echo $i
let i=i++
done
echo "共输入了 $i 个参数。"
i=1
for j in "$*"
do
echo $j
let i=i++
done
echo "共输入了 $i 个参数。"
[root@www shell]# cat for3.sh
#!/bin/bash
#打印100以内的偶数
for i in `seq 100`
do
if [ $[i%2] -eq 0 ] //求余运算
then
echo $i
fi
done
for循环最经典的案例:!!!
打印99乘法表:
[root@www shell]# ./9\*9.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
[root@www shell]# cat 9\*9.sh
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -e -n "$i*$j=$[$i*$j] \t"
done
echo
done
变量的常见写法
1、“1 2 3 4 5 6 7…”
2、seq等等。
3、“$@” “ $#”
4、使用变量
#!/bin/bash
WORD="a b c d f g h"
for i in $WORD
do
echo $i
done
[root@www shell]# ./for2.sh
a
b
c
d
f
g
h
使用for循环可以嵌套,在数据结果与算法中,是以for循环计算一个程序的执行效率的。
while循环:
循环次数不固定的循环。
变量初始值
while 条件表达式或者命令(read)
do
循环体
变量的更新 //一定要有变量的更新,否则死循环
done
当条件成立时执行循环体,条件不满足是跳出循环。
循环中使用输入重定向
while read line
do
done < /script/userlist
表示从这个文件中按行读取。读取到变量line中。
until 与while是相反的
变量的初始值
until 条件表达式或者命令
do
循环体
变量的更新
done
说明:当条件为真,退出循环
until与while是相反的
简单的实现并发
#!/bin/bash
> /tmp/ip.txt
for i in `seq 0 254`
do
(ping 172.16.$i.254 -c2 &> /dev/null
if [ $? -eq 0 ]
then
echo 172.16.$i.254 >> /tmp/ip.txt
fi) & //()中的内容是在子shell中运行的
done
建立很多个子shell。
数组
数组就是一组相同的元素的集合,数组中存放的不一定是数字。
shell中的数组就更为粗糙,甚至不要求存相同类型的元素,shell中的数组分为两类:
1、普通数组 :正常的数组
2、关联数组 :下标为字符串的数组
想要获取某个数组中的值,就要通过数组的下标,这里叫索引,来寻找
定义数组:
数组名[下标]=变量值
数组名=(变量值,变量值,变量值…)
查看数组信息:
[root@www shell]# declare -a
declare -a array1='([0]="name" [1]="pear" [2]="apple")'
declare -a array2='([0]="tom" [1]="jack" [2]="alice")'
访问数组:
[root@www shell]# echo ${array1[2]} //下标为2 的元素
apple
[root@www shell]# echo ${array1[@]} //全部
name pear apple
[root@www shell]# echo ${#array1[@]} //元素个数
3
[root@www shell]# echo ${!array1[@]} //获取下标
0 1 2
[root@www shell]# echo ${array1[@]:1} // 从下标为1 的开始打印输出
pear apple
[root@www shell]#
遍历方法:通过索引,或者元素数量。
定义关联数组
declare -A arr
数组名 [下标名] = 变量名
arr2=([index1]=tom [index2]=jack [index3]=alice [index4]=‘bash shell’)
遍历方法:通过索引遍历。