循環
- 循環執行
將某代碼段重復運行多次
重復運行多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件
- for, while, until
for循環
for 變量名 ?in 列表;do
循環體
done
- 執行機制:
- 依次將列表中的元素賦值給“變量名”; 每次賦值后即執 行一次循環體; 直到列表中的元素耗盡,循環結束
[root@centos7 ~]# type for
for is a shell keyword
[root@centos7 ~]# help for
for: for NAME [in WORDS … ] ; do COMMANDS; done 有多少WORDS就執行多少遍
例子:
#!/bin/bash
for num in 1 2 3 4
do
echo “num is $num”
done
for循環
- 列表生成方式:
(1) 直接給出列表
(2) 整數列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob
如:*.sh
(5) 變量引用
$@, $*
[root@centos7 ~]# for i in {1..5};do echo i=$i;done
i=1
i=2
i=3
i=4
i=5
[root@centos7 ~]# for i in {3..1};do echo i=$i;done
i=3
i=2
i=1
[root@centos7 ~]# for i in {10..2..2};do echo i=$i;done
i=10
i=8
i=6
i=4
i=2
{10..2..2}表示從10到2,每次遞減2
在命令行中用一句話寫出的循環
[root@centos7 ~]# sum=0;for i in {2..100..2};do let sum=sum+i;done;echo $sum
2550
[root@centos7 ~]# sum=0;for i in {2..100..2};do sum=$[sum+i];done;echo $sum
2550
[root@centos7 ~]# sum=0;for i in {2..100..2};do?sum=$((sum+i));done;echo $sum
2550
1-100中所有被3整除的數字相加的和
[root@centos7 ~]# sum=0;for i in {3..100..3};do sum=$[sum+i];done;echo $sum
1683
1-100中所有不能被3整除的數字相加的和
[root@centos7 ~]# n=6; yu=$[n%3] && echo $yu
0
[root@centos7 ~]# n=10; yu=$[n%3] && echo $yu
1
[root@centos7 ~]# n=5; yu=$[n%3] && echo $yu
2
#!/bin/bash
sum=0
for i in {1..100}; do
yu=$[i%3]
if [ “$yu” -ne 0 ];then
let sum+=i
fi
done
echo $sum
[root@centos7 ~]# seq 1 3 10
1
4
7
10
[root@centos7 ~]# seq 10 -3 1
10
7
4
1
使用命令生成列表
[root@centos7 ~]# for filename in `ls /root/*`;do echo filename is $filename;done
[root@centos7 ~]# for filename in ~ding/*;do echo filename is $filename;done
[root@centos7 ~]# for filename in `ls ~ding/*.sh`;do echo filename is $filename;done
filename is /home/ding/123.sh
生成隨機口令
[root@centos7 ~]# openssl rand -base64 8 | head -c8
U3MVFx2u
[root@centos7 ~]# cat /dev/urandom |tr -dc ‘a-zA-Z0-9’ | head -c8
uilsP92K
網絡掃描腳本實現
系統信息掃描
[root@centos7 ~]# nmap -v -A 172.18.16.152
#!/bin/bash
> /app/ip.log
#read -p ‘place input you want scan network IPv4‘s address ‘ net
net=172.18.0
for i in {1..254};do
{
if ping -c1 -w1 $net.$i &> /dev/null;then
echo $net.$i is up
echo $net.$i >> /app/ip.log
else
echo $net.$i is down
fi
}&
done
wait
添加10個用戶user1-user10,密碼為8位隨機字符
創建用戶
[root@centos7 ~]# cat user.sh
#!/bin/bash
for i in `seq 1 100`; do
username=user$i
useradd $username
password=`openssl rand -base64 32 | head -c 8`
echo $password | passwd $username –stdin &> /dev/null
echo $username $password >> password.log
done
echo ‘finish’
刪除用戶
[root@centos7 ~]# cat userdel.sh
#!/bin/bash
for i in {1..100};do
username=user$i
userdel -r $username
done
隨機數
[root@centos7 ~]# cat /dev/urandom | tr -dc ‘a-zA-Z0-9’ | head -c8
JCtRNFJj
[root@centos7 ~]# openssl rand -base64 32 |head -c 8
wvhX1mG7
while循環
- while CONDITION; do
循環體
done
- CONDITION:循環控制條件;進入循環之前,先做一次判 斷;每一次循環之后會再次做判斷;條件為“true”,則執行 一次循環;直到條件測試狀態為“false”終止循環
- 因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
- 進入條件:CONDITION為true
- 退出條件:CONDITION為false
掃描器
掃描httpd服務
#!/bin/bash
sleeptime=30
while true;do
if killall -0 httpd &> /dev/null; then
true
else
systemctl restart httpd
time=`date +’%F %T’`
echo “At $time httpd is restarted” >> /root/httpd_start.log
fi
sleep $sleeptime
done
掃描登錄連接數
#!/bin/bash
while read line; do
username=`echo $line | cut-d: -f1`
echo $username | grep -qE “^user[0-9]+$” && userdel -r $username && echo $username is removed
done < /etc/passwd
[root@localhost ~]# vim re_ip.sh
#!/bin/bash
danger=’2′
file=’ip_ad’
sleep_time=60
while true; do
ss -nt | grep “^ESTAB” | tr -s ” ” ‘:’ |cut -d ‘:’ -f 6 | sort | uniq -c >> /root/”$file”
while read num ip;do
if [[ “$num” -gt “$danger” ]] ;then
iptables -A INPUT -s “$ip” -j REJECT
fi
done < /root/”$file”
sleep “$sleep_time”
> /root/”$file”
done
#!/bin/bash
used=3
df -h | grep “/dev/sd” | while read disk ; do
per=`echo $disk | sed -r ‘s/.* (.*)%.*/\1/’`
part=`echo $disk | cut ?-d” ” -f1`
[ “$per” -gt “$used” ] && echo “$part will be full over ${used}%”
done
顯示登錄失敗的信息
[root@localhost ~]# lastb
root ????tty1 ?????????????????????????Tue Dec 19 08:13 – 08:13 ?(00:00)
root’ ???tty1 ?????????????????????????Tue Dec 19 08:13 – 08:13 ?(00:00)
root ????tty1 ?????????????????????????Sat Dec 16 20:13 – 20:13 ?(00:00)
until循環
- until CONDITION; do
循環體
- done
- 進入條件: CONDITION 為false
- 退出條件: CONDITION 為true
直到條件為真的時候才退出
例子
[root@localhost ~]# vim findccracker.sh
#!/bin/bash
until false; do
sleep 30
pkill -u cracker -9 && echo “at `date +’%F %T’` cracker is killed” >> /root/cracker.log
done
循環控制語句continue
- 用于循環體中
- continue [N]:提前結束第N層的本輪循環,而直接進入下一 輪判斷;最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
continue
fi
CMDn
…
done
循環控制語句break
- 用于循環體中
- break [N]:提前結束第N層循環,最內層為第1層
while CONDTIITON1; do ?CMD1 ?…
if CONDITION2; then
break
fi
CMDn
…
done
循環控制shift命令
- shift [n]
- 用于將參量列表 list 左移指定次數,缺省為左移一次。
- 參量列表 list 一旦被移動,最左端的那個參數就從列表中刪 除。while 循環遍歷位置參量列表時,常用到 shift
- ./doit.sh a b c d e f g h
- ./shfit.sh a b c d e f g h
示例:doit.sh
#!/bin/bash # Name: doit.sh
# Purpose: shift through command line arguments
# Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
echo ?$*
shift
done
示例:
shift.sh
#!/bin/bash
#step through all the positional parameters
until [ -z “$1” ]
do
echo “$1”
shift
done
echo
創建無限循環
while true; do
循環體
done
until false; do
循環體
Done
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/90571