一、循环结构
让特定代码重复执行
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 ,第一个1为起始位置 中间的2为步长 第三个5为结束位置
###########################
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 -i0.1 -W1 172.40.55.$i &>/dev/null (-c:发送的包个数 -i:发送每个数据包之间的间隔 -W:等待响应的时间)
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
###########################
Shell输出颜色控制:
文字颜色30-37:
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
背景颜色40-47
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
末尾控制选项:
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m — \33[37m 设置前景色
\33[40m — \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
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 /调用
###########################
定义函数 .
.(){ .|.& } /&放入后台,一直执行. 本身,死循环,耗光内存瞬间死机
###########################
定义颜色的函数,方便调用
cecho(){ echo -e “\033[$1m $2 \033[0m” }
cecho 32 ok
cecho 33 nihao
2.中断及退出
1) break:中断整个循环
continue:中断本次循环,进入下一次循环
exit:结束整个脚本 =kill,默认返回是0
# ssh 172.40.55.$i “poweroff” /直接把$i关机
###########################
for i in {1..10}
do
[ $i -eq 5 ] && break /break显示到4之后就执行GameOver
echo $1 /continue跳过5显示所有
done /exit 显示到4就结束整个脚本
echo “Game Over !”
###########################
从键盘循环取整数(0结束)并求和,输出最终结果
sum=0
while :
do
read -p “请输入待累加的整数:” num / 键盘循环取整数
[ $num -eq 0 ] && break / 0结束
sum=$[ sum + num ] /求和
done
echo “总和是:$sum ”
###########################
跳过1~20以内非6的倍数,输出其他数的平方值,设定退出代码为2
for i in {1..20} /1~20以内
do
[ $[i%6] -ne 0 ] && continue /非6的倍数
echo $[i*i] / 输出其他数的平方值
done
exit 2 / 设定退出代码为2
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
练习题:
1 编写uaddfor.sh脚本,根据用户名列表快速添加用户账号。
需要添加的账号名称保存在/root/users.txt文件中,每行一个用户名。要求在执行uaddfor.sh脚本后,能够为这些用户名快速添加好系统账号,并将登录密码设置为1234567。#!/bin/bash
if [ $# -eq 0 ];then
echo "please input fileName"
exit 1
elif [ ! -f $1 ];then
echo "input file is not found"
exit 2
fi
for username in $(cat $1)
do
id $username &> /dev/null
if [ $? -eq 0 ];then
echo "$username has exit"
else
useradd $username
echo 1234567 | passwd --stdin $username
fi
done
2 编写sumwhile脚本,计算从1-100之间所有整数的和。
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[sum+i]
let i++
done
echo $sum
3 简述Linux服务脚本中的case分支结构。
case分支结构就是开关结构
当匹配上了给出的条件;就执行相应的程序,然后不会再往下执行
#!/bin/bash
#use case program :
# when you input redhat the output is fedora
# when you input fedora the output is redhat
case $1 in
redhat)
echo "fedora";;
fedora)
echo "redhat";;
*)
echo "your input is not redhat or fedora"
esac
4 简述定义一个Shell函数的两种方法。function 函数名{
}
函数名(){
}
5 简述Shell环境常见的中断及退出控制指令。continue :跳出本轮循环,并不会跳出整个循环体
break: 跳出循环体,执行循环体后面的语句
exit : 退出脚本,默认返回值是0