今天来分享一下最近学习脚本中的循环脚本心得和简易编程。
一.编程中的逻辑处理:
- 顺序执行
- 选择执行
- 循环执行
1. for循环
for 变量名 in 列表;do
循环体
done
for循环的列表生成方法
如下:
in后列表有几个既循环赋值给i几次 循环执行几次
seq 正反跳步生成列表
双引号会把参数变为一个整体
"$* " 会变为一个整体参数 既abc
"$@" 会分辨显示参数 既 a b c
小心使用即可
来看看具体使用情况及脚本吧
- 100以内的奇数累加
- 既对2取模 余1就执行+=命令
#!/bin/bash declare -i sum=0 for i in {1..100};do if [ $[i%2] -eq 1 ];then let sum+=i fi done echo sum=$sum```
- 创建10个用户随机生成口令并下次登录更改密码
#!/bin/bash for i in {1..10};do useradd user$i password=`tr -dc '[:alnum:]' < /dev/urandom |head -c 8` echo user$i:$password | tee -a pass.txt |chpasswd passwd -e user$i echo "User:user$i is created" done
4.提取用户名并批量删除用户
5.扫描网络,找出能联通的IP 并保存在文件中
NETID=172.16.128#!/bin/bash for HOSTID in {1..254};do { if ping -c1 -W1 $NETID.$HOSTID &> /dev/null ;then echo $NETID.$HOSTID is up | tee -a hostlist.txt fi } & done wait```
2.for 循环的第二种写法
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
如上图,由表达式1 来和表达式二判断,如为真就执行命令 ,在再表达式3的生成下再与表达式二判断,直到与表达式二条件不满足 ,循环停止
看看例子吧:
这个是九九乘法口诀的表示图 效果图如下#!/bin/bash<br/>for ((i=1;i<=9;i++));do<br/>for((j=1;j<=i;j++));do<br/>echo -e "${j}x$i=$[j*i]\t\c"<br/>done<br/>echo <br/>done
for 的两种方法表示99乘法表
3.while循环
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
1.取10个随机数字 取出最大值和最小值
```#!/bin/bash
i=1
MAX=$RANDOM
MIN=$MAX
echo $MAX
while [ $i -lt 10 ];do
N=$RANDOM
echo $N
if [ $N -gt $MAX ];then
MAX=$N
elif [ $N -lt $MIN ];then
MIN=$N
fi
let i++
done
echo MAX=$MAX, MIN=$MIN2. 监控服务的启动状态、如果关闭则重新服务 ![](https://s1.51cto.com/images/blog/201906/18/6257148a3ab81965bbf3f55629e25ecb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 每10秒监控一次,并生成日志文件 ```SLEEPTIME=10 while :;do if ! killall -0 php-fpm &> /dev/null;then systemctl restart php-fpm &> /dev/null echo "At `date +'%F %T'` php-fpm is restarted" >> /var/log/monitor.log fi sleep $SLEEPTIME done```
4.循环控制语句continue
用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
continue 中断循环中某一次循环 continue2 终端上一层循环
5.循环控制语句break
用于循环体中
break [N]:提前结束第N层循环,最内层为第1层
同理,break2 中断第二层循环
6.接下来找几个有趣的例子;
- 数字猜猜猜
#!/bin/bash N=$[RANDOM%10+1] while read -p "input a number(1-10):" NUM ;do if [[ $NUM =~ ^[[:digit:]]+$ ]];then if [ $NUM -eq $N ];then echo OK break elif [ $NUM -gt $N ];then echo too large! else echo too small! fi else echo "Please input a digit" fi done```
- 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?
#!/bin/bash<br/>sum=1<br/>for i in {1..9};do<br/>let sum=(sum+1)*2<br/>done<br/>echo "num is : $sum "
- 打印等腰三角形
``` #!/bin/bash
read -p "place input isoceles triangle:" line
for i in $(seq 1 $line);do
spacenum=$[line-i]
anum=$[2i-1]
for j in $(seq 1 $spacenum);do
echo -e " \c"
done
for k in $(seq 1 $anum);do
echo -e "\c"
done
echo
done
4. 扫描网络中有多少主机是开启,有多少主机是关闭
``` #!/bin/sh
read -p "please input new(eg:192.168.0.0): " net
netid=`echo $net|cut -d. -f1-2`
i=0
up=0
down=0
while [ $i -le 254 ];do
j=1
while [ $j -le 254 ];do
if ping -c1 -w1 $netid.$i.$j &>/dev/null;then
echo "the $netid.$i.$j is up"
let up++
else
echo "the $netid.$i.$j is down"
let down++
fi
let j++
done
let i++
done
echo "the up is $up"
echo "the down is $down"```
5. 实现打印国际象棋棋盘
```#!/bin/bash
i=1
while [ $i -le 8 ];do
j=1
while [ $j -le 4 ];do
if [ $[$i%2] -eq 0 ];then
echo -e "\e[1;41m \e[0m\e[1;43m \e[0m\c"
else
echo -e "\e[1;43m \e[0m\e[1;41m \e[0m\c"
fi
let j++
done
echo
let i++
done```
for 的循环写法
``` #!/bin/bash
for i in {1..8};do
for j in {1..4};do
if [ $[i%2] -eq 0 ];then
echo -e "\e[1;41m \e[0m\e[1;43m \e[0m\c"
else
echo -e "\e[1;43m \e[0m\e[1;41m \e[0m\c"
fi
done
echo
done```
## 二.函数
函数由两部分组成:函数名和函数体
help function
语法一:
f_name (){
...函数体...
}
语法二:
function f_name {
...函数体...
}
语法三:
function f_name () {
...函数体...
}
通常用第三种方法定义,比较清楚明了
函数获取操作系统版本
func_os_version(){
sed -nr 's/.* ([0-9]+)\..*/\1/p' /etc/redhat-release
}
#### 删除shell函数
命令格式为:
unset function_name
示例:
unset findit
再键入set命令,函数将不再显示
环境函数
使子进程也可使用
声明:export -f function_name
查看:export -f 或 declare -xf
#### 通常在较本中常用函数会放在单独文件中
使用时可以调用函数库
函数文件已创建好后,要将它载入shell
定位函数文件并载入shell的格式
. filename 或 source filename
注意:此即<点> <空格> <文件名>
这里的文件名要带正确路径
判断是否是数字的shell函数
```func_is_digit(){
if [ ! "$1" ];then
echo "Usage:func_is_digit number"
return 10
elif [[ $1 =~ ^[[:digit:]]+$ ]];then
return 0
else
echo "Not a digit"
return 1
fi
}```
## 今天就分享到这里了 谢谢咯
转载于:https://blog.51cto.com/14322554/2410511