一、for循環
?用法:
for 變量 in 取值列表
do
? ? ? ? 命令序列
done
例1:打印1到10的數字列表
#!/bin/bashfor i in {1..10}
do
echo $i
done
?例2:#批量添加用戶,用戶名存放在users.txt文件中,每行一個,初始密碼均設為123456
#!/bin/bashuserfile=/root/users.txtfor name in $(cat $userfile)
douseradd $nameecho 123456 | passwd --stdin $name &> /dev/null
done echo "批量添加用戶完成"
?例3:
根據IP地址檢查主機狀態 IP地址存放在ipadds.txt文件中,每行一個 使用ping命令檢測各主機的連通性
#!/bin/bash
#根據IP地址檢查主機狀態 IP地址存放在ipadds.txt文件中,每行一個 使用ping命令檢測各主機的連通性
filepath=/root/for/ipadds.txtfor hostip in $(cat $filepath)
doping -c 4 -i 0.5 -W 2 $hostip &> /dev/nullif [ $? -eq 0 ];thenecho "$hostip is online" >> /root/for/result.txtelseecho "$hostip is offline">> /root/for/result.txtfi
done
例4:
根據IP地址檢查主機狀態 使用ping命令檢測 192.168.80.10 20 30 40 50 60主機的連通性
#!/bin/bash
#根據IP地址檢查主機狀態 使用ping命令檢測 192.168.80.10 20 30 40 50 60主機的連通性for num in {1..6}
dohostip="192.168.80.${num}0"ping -c 4 -i 0.5 -W 2 $hostip &> /dev/nullif [ $? -eq 0 ];thenecho "$hostip is online"elseecho "$hostip is offline"fi
done
例5:
輸出1到10的整數,并判斷奇偶數
#!/bin/bash
#輸出1到10的整數,并判斷奇偶數for ((i=1; i<=10; i++))
doa=$[i % 2]if [ $a -eq 1 ];thenecho "$i 為奇數" elseecho "$i 為偶數"fidone
例6:
根據IP地址檢查主機狀態 使用ping命令檢測 192.168.80.0~255 的主機,獲取在線的主機清單
#!/bin/bash
#根據IP地址檢查主機狀態 使用ping命令檢測 192.168.80.0~255 的主機,獲取在線的主機清單for num in {0..255}
do{hostip="192.168.80.$num"ping -c 4 -i 0.5 -W 2 $hostip &> /dev/nullif [ $? -eq 0 ];thenecho "$hostip is online" >> /root/host.txtfi}&
done
wait
cat /root/host.txt
例7:
輸出1到10的整數,并判斷奇偶數
#!/bin/bash
#輸出1到10的整數,并判斷奇偶數for ((i=1; i<=10; i++))
doa=$[i % 2]if [ $a -eq 1 ];thenecho "$i 為奇數" elseecho "$i 為偶數"fidone
例8:
求1到10的和
#!/bin/bash
#求1到10的和
sum=0
for ((i=1; i<=10; i++))
{sum=$[sum + $i]
}
echo "1到10的和為 $sum"
例9:
輸出PATH環境變量的目錄里所有以xy開頭的文件
#!/bin/bash
#輸出PATH環境變量的目錄里所有以xy開頭的文件IFS_OLD=$IFS
IFS=$IFS':'for i in $PATH
do#ls $i/xy* 2> /dev/nullfind $i -name "xy*" -print 2> /dev/null
done
例10:
求裴波拉切數:1,1,2,3,5,8,13,21,34,55,89...,數列從第3項開始每一項等于前兩項之和,打印前10個元素
#!/bin/bash
#求裴波拉切數:1,1,2,3,5,8,13,21,34,55,89...,數列從第3項開始每一項等于前兩項之和,打印前10個元素first=1
second=1for ((i=1; i<=10; i++))
doecho $firstC=$[first + second]first=$secondsecond=$C
done
例11:
自動生成一個8位數的隨機密碼,密碼范圍可以是小大寫字母和數字
#!/bin/bash
#自動生成一個8位數的隨機密碼,密碼范圍可以是小大寫字母和數字STR="0123456789shicaijundashuaigeABCDEFGHIJKLMNOPQRSTUVWXYZ"for ((i=1; i<=8; i++))
do#獲取字符串所有下標的隨機數num=$[RANDOM % ${#STR}]#根據隨機下標獲取一個隨機字符passd=${STR:num:1}#將隨機字符進行拼接password+=$passddoneecho "8位隨機密碼為 $password"
?例12
用戶名存放在users.txt文件中,每行一個,判斷文件里的用戶是否存在,若該用戶存在,輸出提示該用戶已存在;用戶存在但沒設密碼,則提示用戶并讓用戶設置密碼:若該用戶不存在,提示用戶輸入密碼,建立用戶并設立其密碼
?
#!/bin/bash
#用戶名存放在users.txt文件中,每行一個,判斷文件里的用戶是否存在,若該用戶存在,輸出提示該用戶已存在;用戶存在但沒設密碼,則提示用戶并讓用戶設置密碼:若該用戶不存在,提示用戶輸入密碼,建立用戶并設立其密碼usrfile=/root/users.txt
#循環遍歷文件里的每行用戶
for iname in $(cat $usrfile)
do#判斷是否存在grep "^$iname" /etc/passwd &> /dev/nullif [ $? -eq 0 ];thenecho "$iname 用戶已存在"#判斷用戶是否設置密碼userpasswd=$(cat /etc/shadow | grep "^$iname" | awk -F: '{print $2}')if [ "$userpasswd" == "!!" ] || [ "$userpasswd" == "*" ] || [ -z "$userpasswd" ];thenecho "$iname 用戶沒設密碼。"read -p "請設置 $iname 用戶的密碼:" pd1read -p "請確認設置 $iname 用戶的密碼:" pd2if [ "$pd1" == "$pd2" ];thenecho $pd1 | passwd --stdin $iname &> /dev/nullelseecho "密碼輸入不正確,放棄設置...." fifi else#創建不存在的用戶并設置密碼echo "$iname 用戶不存在,正常創建用戶....."read -p "請設置 $iname 用戶的密碼:" password1read -p "請確認設置 $iname 用戶的密碼:" password2if [ "$password1" == "$password2" ];thenuseradd $inameecho $password1 | passwd --stdin $iname &> /dev/nullelseecho "密碼輸入不正確,放棄設置...." fifi
done
二、while循環
格式:
?while 條件測試操作
?do ? ?
命令序列
?done
例1:?
提示用戶輸入一個小于100的整數,并計算從1到該數之間所有整數的和
#!/bin/bash
read -p "請輸入一個100以內的數:" ia=1
sum=0
if [ $i -ge 1 ] && [ $i -le 100 ];thenwhile [ $a -le $i ]dolet sum+=alet a++doneecho "1到$i的總和為$sum"
elseecho "重新輸入"
fi
例2:
求1~100所有整數的偶數和、奇數和
#!/bin/bash
a=1
oddsum=0
evensum=0while [ $a -le 100 ]
do b=$[ a%2 ] if [ $b -eq 0 ];thenlet evensum+=$aelse let oddsum+=$afi let a++
done
echo " 奇數為$oddsum,偶數為$evensum"
例3:
測試指定范圍主機是否通信,并將通信主機的Ip寫到host_ip文件中
#!/bin/basha=100
while [ $a -le 104 ]
dohostip=192.168.10.$aping -c 2 -i 0.5 -w 2 $hostip &> /dev/nullif [ $? -eq 0 ];thenecho "$hostip 在線" >> /root/host_ipfilet a++
donecat /root/host_ip
例4:
用戶輸入密碼,腳本判斷密碼是否正確,正確密碼為123456,輸入正確提示正確信息,連續輸錯3次則報警
#!/bin/bashi=0
while [ $i -le 2 ]
doread -p "輸入密碼:" passwordif [ $password == 123456 ];thenecho "密碼正確"exit 0 else echo "密碼錯誤"fi let i++
done
echo "超過三次"
例5:
把0~255的十進制整數轉換成8位二進制數
#!/bin/bash
#把0~255的十進制整數轉換成8位二進制數
read -p "請輸入一個0~255的整數:" num
for i in 128 64 32 16 8 4 2 1
doNUM=$[num - i]if [ $NUM -lt 0 ];thenecho -n 0elseecho -n 1num=$[num - i]fi
done
echo ""
例6:
用while循環將一個200行的文件分割成多個50行的文件
#!/bin/bash
#用while循環將一個200行的文件分割成多個50行的文件filepath=/root/day10/test.txt
#定義行數計數器變量
a=0
#定義文件序號變量
i=1cat $filepath | while read line
dolet a++#判斷是否已經讀入50行,滿50行則文件序號+1c=$[a % 50]if [ $c -eq 0 ];thenecho $line >> /root/day10/test${i}.txtlet i++elseecho $line >> /root/day10/test${i}.txtfi
done
三、until循環
注:條件不符合就會一直循環,直到條件符合后才會退出循環
until 條件測試操作 ?
do ? ?
命令序列 ?
done?
例題:
打印數字1-10??
[root@localhost xunhuan]#until [ $i -gt 10 ]
> do
> echo $i
> let i++
> done