循環
shell中的循環主要有for,while,untile,select
for
1、列表for循環
for VARIABLE in (list)
do
command
done
例:循環打印john喜歡的水果
for fruit in apple orange banana pear
do
echo "$fruit is John's favorite"
done
echo "No more fruits."
注意:
in里面可以是任意命令的標準輸出
如:
fruits="apple orange banana pear"
seq 1 2 100 #產生1到100的奇數數列
ls
1..5 #表示1 2 3 4 5
#!/bin/bash
echo '變量作為in的參數'
fruits="apple orange pear"
for fruit in ${fruits}
do
echo $fruit
done
echo "序列作為in的參數"
for var in 1 2 3 4 5
do
echo $var
done
echo "seq產生的序列作為in的參數"
#declare -i total=0
total=0
for var in $(seq 1 2 100)
do
#total+=$var
#(( total += var )) #注意算數運算的寫法,1共3種寫法都可以實現賦值
let "total+=var"
done
echo "1+3+5+...+99 is $total"
echo "ls的結果作為in的參數"
for var in $(ls)
do
ls -l $var
done
2、不帶列表的for循環
for variable
do
command
done
注意:使用不帶列表的for,需要在運行腳本時通過參數的方式給for傳遞變量值
#for.sh
#!/bin/bash
for var
do
echo $var
done
# . ./for.sh 1 2 3
可讀性差,可使用$@實現上面的功能
改進:
#!/bin/bash
for var in $@
do
echo $var
done
3、類Cfor循環
for ((expression ;expression2; expression3))
do
command
done
例:
#!/bin/bash
for (( i=0; i<10; i++ )) #這里沒有甚么空格的要求,為了美觀,使用空格
do
echo -n "$i "
done
4、for的無窮循環
for((;1;))
do
echo
done
while
while expression
do
command
done
例:
1、#輸出1到10的數字序列
#!/bin/bash
declare -i count=0
while [[ $count -lt 10 ]]
do
echo "$count"
count+=1
done
2、#求1⑴00之和
#求1⑴00之間奇數之和
#!/bin/bash
declare -i sum01=0
declare -i sum02=0
declare -i i=1
declare -i j=1
while [[ i -le 100 ]]
do
sum01+=i;
j=i%2;
#if [[ $(( i%2 )) -ne 0 ]];then
if [[ j -ne 0 ]];then
sum02+=i;
fi
((i++));#這里不可1寫$((i++))
done
echo $sum01
echo $sum02
3、#猜數字
#!/bin/bash
num=8
echo "Input a number in 1 to 10:"
#體會read的用法
while read guass
do
if [[ $guass -eq $num ]];then
echo "Right."
break
else
echo "Wrong.Try Again"
fi
done
4、按行讀取文件
cat student_info.txt
John 30 Boy
Sue 28 Girl
Wang 25 Boy
Xu 23 Girl
解法1:
#!/bin/bash
while read line
do
name=`echo $line | cut -d ' ' -f1` #echo輸出line以后Tab會變成空格,所以使用cut的時候需要指定分割符(-d ' ')
age=`echo $line | cut -d ' ' -f2` #也能夠使用awk awk '{print $n}',awk的分割符是空格(' ')或Tab
sex=`echo $line | cut -d ' ' -f3`
echo "My name is $name,I'm $age years old,I'm a $sex"
done < student_info.txt
注意:全部思路是清晰的,重點是怎樣讀取文件,選用甚么命令處理行。比較而言,腳本比編輯1個高級語言程序要簡潔很多
解法2:
#!/bin/bash
cat student_info.txt | while read line
do
name=`echo $line | cut -d ' ' -f1`
age=`echo $line | cut -d ' ' -f2`
sex=`echo $line | cut -d ' ' -f3`
echo "My name is $name,I'm $age years old,I'm a $sex"
done
兩種解法功能相同,但是有細微差別。使用重定向的while只會產生1個shell,而使用管道的腳本在運行時會產生3個shell,第1個shell是cat(運行很快,致使沒法使用ps命令抓到),第2個shell是管道,第3個shell是while
5、無窮循環
#方法1
while ((1))
do
command
done
#方法2
while true
do
command
done
#方法3
while :
do
command
done
例:檢測系統進程,
#!/bin/bash
while true
do
ATD_STATUS=`service atd status | grep running`
if [[ -z "$ATD_STATUS" ]];then
echo "ATD is stopped , try to restart."
service atd restart #在腳本中,如果不需要命令的返回值,則直接寫命令便可,而不需要用$()命令替換
else
echo "ATD is running,wait 5 sec until next check"
fi
sleep 5 #延遲函數,單位是秒(s)
done
until
結構:
until expression
do
command
done
描寫:
運行前測試,測試結果為false時繼續履行,為true時退出
例:
#使用until計算1到100的和和1⑴00的奇數和
#!/bin/bash
declare -i sum01=0
declare -i sum02=0
declare -i i=0
until [[ i -gt 100 ]]
do
sum01+=i
if [[ $[i%2] -ne 0 ]];then
sum02+=i
fi
((i++));
done
echo "sum01=$sum01"
echo "sum02=$sum02"
until的無窮循環
until ((0))
do
command
done
until false
do
command
done
select循環
結構:
select Menu in (list)
do
command
done
描寫:
菜單擴大循環方式,語法和帶列表的for循環非常類似
例:
1、判斷用戶的選擇
#!/bin/bash
echo "Which car do you prefer?"
select car in Benz Audi VolksWagen
do
break #注意這個break,沒有這個會1直處于選擇狀態
done
echo "You chose $car"
注解:select有判斷用戶輸入的功能,所以select常常和case語句合并使用,
2、聯合使用select和case
#!/bin/bash
select var in Mon Tue Wed Thu Fri Sat Sun
do
case $var in #case是不需要break語句的
Mon)
echo "Today is Monday"
break ;;
Tue)
echo "Today is Tuesday"
break;;
Wed)
echo "Today is Wednesday"
break ;;
Thu)
echo "Today is Thursday"
break ;;
Fri)
echo "Today is Friday"
break ;;
Sat|Sun)
echo "You can have a rest day"
break;;
*)
echo "Unknown input.Try again" ;;
esac
done
嵌套循環
例:打印99乘法表
#!/bin/bash
declare -i i=1;
declare -i j=1;
declare -i k=0
for (( i = 1; i <= 9; i++ ))
do
for (( j = 1; j <= i; j++ ))
do
k=$i+$j
#let "k=i+j"
echo -ne $j"*"$i"="$k" "
#echo -ne $j"*"$i"="$(($i+$j))" "
#echo -ne $j"*"$i"="$[$j*$i]" "
#這里看到了多種表達式求值
done
echo
done
注意:
1、for的類C寫法,不需要$符號,也不需要使用-le之類的
2、echo輸出制表符,需要使用-e參數,這表示有轉義字符時轉義。沒有-e會原樣輸出而不解釋轉義字符
3、表達式求值
4、自行改編成其他循環版本的99乘法表
擴大:使用sed和awk輸出99乘法表
#!/bin/bash
seq 9 |sed "H;g"|awk -v RS="" '{
for(i=1;i<=NF;i++){
j=i*NR;
printf("%d*%d=%d ",i,NR,i*NR);
}
printf("
");
}'
循環控制
break
continue
不做詳細介紹,跟高級語言1樣,唯1的區分是break,continue后面可以接數字,表示跳出嵌套層數,和Java中的標簽類似。
例:打印素數
解法1:
#!/bin/bash
declare -i i=1
declare -i j=2
for (( i = 1; i < 100 ; i++ ))
do
for (( j = 2; j < i ;j++ ))
do
if ! (($i%$j));then #注意! 和(())擴大運算之間有空格
break;
fi
done
if [[ $j -eq $i ]];then
echo -ne "$i "
fi
done
echo
解法2:
#!/bin/bash
declare -i i=1
declare -i j=2
for (( i = 1; i < 100 ; i++ ))
do
for (( j = 2; j < i ;j++ ))
do
if ! (($i%$j));then #注意! 和(())擴大運算之間有空格
continue 2; #continue后面的數字表示跳出的嵌套數
fi
done
if [[ $j -eq $i ]];then
echo -ne "$i "
fi
done
echo
下一篇 mysql二進制類型