在編程語言中,循環語句是最基本的語法之一,在Shell(這里是Bash)中也不例外。把相關內容整理一下吧。
這里包括for/while/until循環,以及變量自增的語法實例。
Shell(以Bash為例)中的循環語句一般有for、while、until這幾種,偶爾還有寫錯語法的時候,這里結合實例來自己總結一下。也為今后使用提供一個快捷的資料獲取渠道。
一、for循環語句
實例1.1 對目錄中的文件做for循環
#!/bin/bash
for x in
/var/log/*
do
#echo "$x is a file living in /var/log"
echo $(basename $x) is a file living in
/var/log
done
注:這個$x獲得的是絕對路徑文件名;可以使用 “basename”
可執行程序來除去前面的路徑信息。如果只引用當前工作目錄中的文件(例如,如果輸入 “for x in
*”),則產生的文件列表將沒有路徑信息的前綴。
實例1.2 對位置參數做for循環
#!/bin/bash
for thing in
"$@"
do
echo you typed ${thing}.
done
實例1.3 for循環中用seq產生循環次數,加上C語言形式的for循環語句
#!/bin/bash
echo "for: Traditional form:
for var in …"
for j in $(seq 1 5)
do
echo
$j
done
echo "for: C language form: for (( exp1; exp2; exp3
))"
for (( i=1; i<=5; i++ ))
do
echo "i=$i"
done
二、while循環語句
實例2.1 循環輸出1到10的數字
復制代碼 代碼如下:
#!/bin/bash
myvar=1
while [ $myvar
-le 10 ]
do
echo $myvar
myvar=$(( $myvar + 1
))
done
只要特定條件為真,”while” 語句就會執行
三、until循環語句
實例3.1 循環輸出1到10的數字
“Until” 語句提供了與
“while” 語句相反的功能:只要特定條件為假,它們就重復。下面是一個與前面的 “while” 循環具有同等功能的 “until” 循環。
復制代碼 代碼如下:
#!/bin/bash
myvar=1
until [ $myvar
-gt 10 ]
do
echo $myvar
myvar=$(( $myvar + 1
))
done
Linux
Shell中寫循環時,常常要用到變量的自增,現在總結一下整型變量自增的方法。
我所知道的,bash中,變量自增,目前有五種方法:
1.
i=`expr $i + 1`;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i
+ 1 ))
可以實踐一下,簡單的實例如下:
#!/bin/bash i=0;while [ $i -lt 4 ];do echo $i; i=`expr $i + 1`; # let i+=1; # ((i++)); # i=$[$i+1]; # i=$(( $i + 1 ))done
課后作業:
1.求100以內所有正整數之和
2.編寫腳本,通過ping命令探測10.1.252.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
結果:
#!/bin/bash ip=1 up=0 down=0 ipv4=10.1.252 until [ $n -gt 255 ] do IP="$ipv4"."$n" #for ipv in {0..255} ;do # IP="$ipv4"."$ipv" let n++ ping "$IP" -c 1 -W 1 &>/dev/null && echo "The Up IPv4 is:$IP" && let up+=1 &>/dev/null || let down+=1 &>/dev/null done echo "IPv4($ipv4.1-255) up is :$up" echo "IPv4($ipv4.1-255) down is :$down"
3.編寫腳本,打印九九乘法表
代碼:
#/bin/bash i=1 j=1 until (($i>=10)) do j=1 until (($j>$i)) do sum=$[ $j*$i ] echo -ne "$i*$j=$sum \t" if [ $i == $j ] ;then echo -en "\n" fi let j++ done let i++ done
4.編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash i=0 while (( i<10 ));do array[$i]=$((RANDOM%100)) echo -n " ${array[$i]}" let i++ done echo max=${array[0]} for j in `seq 1 9`;do if [ $max -lt ${array[$j]} ];then max=${array[$j]} else fi done echo $ma
x
5.編寫腳本,實現打印國際象棋棋盤
~
#!/bin/bash let i=0 let j=0 for ((i=0; i < 8; i++));do echo -n $i for((j=0; j < 8; j++));do if [ $[$[$i+$j]%2] -eq 0 ];then echo -en "\033[43m \033[0m" else echo -en "\033[42m \033[0m" fi done echo done echo -e " " {A..H} ~
~
6.打印等腰三角形
#!/bin/bash for i in `seq 1 2 10`;do k=1 while [ $k -le $((10-$(($i+1))/2)) ];do echo -ne " " let k++ done for j in `seq 1 $i`;do echo -n "*" done echo done #!/bin/bash i=1 while [ $i -le 10 ] ; do j=1 while [ $j -le $((10-$i)) ] ; do echo -n ' ' j=$(($j+1)) done j=1 while [ $j -le $((2*$i-1)) ] ; do echo -n x j=$(($j+1)) done echo i=$(($i+1))
7.猜數字游戲
#!/bin/bash s=0 I=3 while (( $s == 0 ));do var=$((RANDOM%11)) echo "welcome! you will have three times to guess a number in range 0 to 10!" while (( $I != 0 ));do read -p " please input you guess number:" guess if [ $guess-ge 0 ] &> /dev/null;then if [ $guess -lt $var ];then echo "you guess number is too little, you have $[$I-1] time to try " elif [ $guess -gt $var ];then echo " you gues number is too large, you have $[$I-1] time to try" elif [ $guess -eq $var ];then echo -e "\033[32moh,great! you are win\033[0m" read -p "do you want to continue ?, anykey to continue ,n to quit :" c if [ $c == n ];then echo "you have quit game,goodbye!" exit else echo "you will comtinue , good luck to yoiu" s=0 I=3 continue 3 fi fi else echo " you input is wrong,please again" continue fi let I-- done if [ $I==0 ];then echo -e "\033[31moh,sorry,you lose!\033[0m" fi read -p "do you want to continue ?, anykey to continue ,n to quit :" c if [ $c == n ];then echo "you have quit game,goodbye!" s=1 else echo "you will comtinue , good luck to yoiu" s=0 I=3 fi done
原創文章,作者:zsyzgw,如若轉載,請注明出處:http://www.www58058.com/37050