###################################################
shell 脚本编程
一、循环结构
让特定代码重复执行
1.for循环
1)特点:循环的次数是固定的!
2)语法结构及特点
for 变量 in 值1 值2 …
do
命令
done
for ((i=1;i<10;i++)) /另一种写法
do
命令
done
###########################
seq 1 5 = seq 5 = echo {1..5} 默认起始位置为1
seq 1 2 5 --输出1 3 5 ,中间的2为步长
###########################
3)应用
# 输出3个chenguiz / 或 `seq 3` 或 {1..3}
for i in 1 2 3
do
echo "chenguiz"
done
###########################
# 快速创建1000个文件
for i in {1..1000}
do
touch /tmp/$i .txt
done
###########################
#读取用户文件,自动创建用户,初始密码为123456
for i in $(cat /root/user.txt)
do
id $i &>/dev/null
if [ $? -ne 0 ];then
useradd $i
echo "123456" | passwd --stdin $i &>/dev/null
echo "$i 用户创建成功!"
else
echo "$i 用户已存在" >> /root/user.log
fi
done
###########################
#拼网段,分开导出以便查看
for i in {113..119}
do
ping -c 2 172.40.55.$i &>/dev/null
if [ $? -eq 0 ];then
echo "172.40.55.$i is up !" >>/root/up.log
else
echo "172.40.55.$i is down !" >>/root/down.log
fi
done
###########################
猴子摘了若干香蕉,吃了一半,多吃了一个。第二天吃了一半,又多吃了一个,以此类推,第九天,剩一个。
2.while循环
1)特点:不定次数,当判断为真时,一直循环执行;判断为假,则循环结束。
四循环的缺点:超耗内存,需sleep 0.1
2)结构
while [ 判断 ]
do
命令
done
while : /死循环固定格式 加冒号
do
命令
done
###########################
3)应用
#循环10次
i=1
while [ $i -le 10 ]
do
echo "你好!"
i=$[i+1] 或let i++ /循环10次
done
###########################
#无限猜
num=$[RANDOM%100+1] /随机数取100的余数(0-99)加1 (1-100)
i=0 /先定义次数的变量
while :
do
read -p "有个随机数,你来猜猜看:" cai
let i++ /每猜一次加一
if [ $cai -eq $num ];then
echo "恭喜你,猜对了!共猜了$i 次。"
exit /猜对并退出
elif [ $cai -gt $num ];then
echo "猜大了"
else
echo "猜小了"
fi
done
###########################
打印一个9*9乘法表
难点:不换行 echo -n “2*1=2” ;echo -n “2*2=4”
for i in `seq 9` for j in `seq 9`
echo “$i*$j=$[i*j]”
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i` /$i让j永远小于等于i
do
echo -n "$i*$j=$[i*j] " /引号最后留个空格以隔开
done
echo /里面执行完后换行
done
###########################
二、服务脚本设计
1.case分支结构
1)case 语句 【简单的if:只能执行等于的值,判断等于和不等于】
case 变量 in
值1)
命令;; /命令结束用双分号
值2)
命令;;
值*)
命令;; /最后一个值的双分号可加可不加
esac
###########################
当运行/root/foo.sh redhat,输出为fedora ;当运行/root/foo.sh fedora,输出为redhat ;当没有任何参数或者参数不是 redhat 或者 fedora时,其错误输出产生以下信息: /root/foo.sh redhat|fedora
#!/bin/bash
case $1 in
readhat)
echo “nihao” /命令未完不用分号
echo “fedora”;; /命令结束用双分号
fedora)
echo “readhat”;;
*)
echo '/root/foo.sh redhat|fedora ';;
esac
###########################
创建选项
#!/bin/bash
case $1 in
-t)
touch $2;;
-c)
cat $2;;
-e)
vim $2;;
-d)
rm -rf $2;;
*)
echo “用法:test.sh [-t|-c|-e|-d]文件”
esac
###########################
read -p “请输入任意:” key
case $key in
[a-z]) /case的优势,支持[ ]
echo “字母”;;
[0-9])
echo “数字”;;
*)
echo “其他字符”;;
esac
三、函数及中断控制
1.shell函数
1)定义函数(脚本执行完就失效):
函数名() { 命令序列 } 或 function 函数名 { 命令序列 }
2)调用函数
# chen(){ mkdir -p $1; cd $1; pwd; } /定义
#chen /mnt/chen /调用
###########################
# 使用函数做计算
由用户在执行时提供2个整数值参数,计算这2个整数的加、减、乘、除结果
jsq(){
echo -n "$1+$2 = $[$1+$2] "
echo -n "$1-$2 = $[$1-$2] "
echo -n "$1*$2 = $[$1*$2] "
echo -n "$1/$2 = $[$1/$2] "
echo
}
echo "欢迎使用计算器"
jsq 12 55
jsq 55 90
###########################
定义函数 .
.(){ .|.& } /&放入后台,一直执行. 本身,死循环,耗光内存瞬间死机
###########################
定义颜色的函数,方便调用
cecho(){ echo -e “ 33[$1m $2