Linux Shell:Shell循環(huán)語句

摘要:Linux,Shell

Shell中常用循環(huán)有for,while

Shell循環(huán)語法結(jié)構(gòu)

(1)for循環(huán)語句

for循環(huán)只能用于固定次數(shù)的循環(huán),因此不能無限循環(huán)和用于一些在后臺守護(hù)進(jìn)程一直運行的程序,語法語句如下

for 變量名 in 取值列表
do
    循環(huán)體
done

也可以寫成一行,用分隔

for 變量名 in 取值列表;do 循環(huán)體;done

取值列表內(nèi)元素以空格隔開,如果元素帶有空格則用引號包裹起來,例子如下

#!/bin/bash

for i in 4 a '6 1'
do
    echo $i
done

echo $i

輸出如下,可見循環(huán)到最后退出循環(huán),引用變量依舊是最后一個取值列表元素

4
a
6 1
6 1

一行的寫法

for i in 4 a c 11 '6 1';do echo $i;done

(2)C語法的for循環(huán)語句

Shell的for循環(huán)也可以采用C語言的寫法,注意是雙括號,用分號;間隔

for ((初始值;循環(huán)控制條件;變量變化))
do
    循環(huán)體
done

一個簡單例子

#!/bin/bash

num=0
for ((i=0;i<=10;i++))
do
    let num=num+$i
    echo $num
done

(3)while循環(huán)語句

while循環(huán)語句結(jié)合條件測試使用,語法如下

#!/bin/bash
while 條件測試
do
    循環(huán)體
done

舉一個例子

#!/bin/bash

num=1
while [ $num -le 5 ]
do
    echo $num
    let num++
done

(4)在循環(huán)中使用條件測試

在循環(huán)中使用條件測試實現(xiàn)復(fù)雜的邏輯,例如

#!/bin/bash

for i in {0..10}
do
    if [ $i -gt 5 ];then
        echo ${i}大于5
    else
        echo ${i}小于等于5
    fi
done

也可以使用&&,||一行完成,省去if,fi

#!/bin/bash

for i in {0..10}
do
    [ $i -gt 5 ] && echo ${i}大于5 || echo ${i} 小于等于5
done

continue和break語句

Shell的continue,break語句和Python一樣,例子如下
break語句下輸出4

for i in `seq 1 1 10`
do
        if [ $i -eq 5 ];then
                break
        fi
        if [ $i -gt 3 ];then
            echo $i
        fi
done 

continue語句下輸出4 6 7 8 9 10

for i in `seq 1 1 10`
do
        if [ $i -eq 5 ];then
                continue
        fi
        if [ $i -gt 3 ];then
            echo $i
        fi
done 

常用的循環(huán)體

常見結(jié)合使用的循環(huán)體有序列,數(shù)組,命令行傳參文件目錄和文件

1.序列

序列通過seq命令或者{begin..end..step}符號進(jìn)行定義:

  • seq:指定初始值(可選),步長(可選),結(jié)束值構(gòu)造序列,初始值默認(rèn)1,步長默認(rèn)1,序列包含結(jié)束值
  • {begin..end..step}:指定初始值,結(jié)束值,步長(可選)構(gòu)造序列,序列包含結(jié)束值
root@ubuntu:~/Shell# seq 1 4
1
2
3
4
root@ubuntu:~/Shell# seq -s ' ' 1 2 4
1 3  # 指定分隔符為空格
root@ubuntu:~/Shell# seq 4 -1 2
4
3
2

結(jié)合for循環(huán)使用案例

#!/bin/bash

for i in `seq 1 5`
do
    echo $i
done
#!/bin/bash

for i in {1..5}
do
    echo $i
done
2.數(shù)組

在Shell中使用小括號()定義數(shù)組,數(shù)組遍歷使用[@]符號,防止元素有空格用雙引號包起來,,例子如下

a=(1 2 'c d' k)
for i in "${a[@]}"
do
        echo $i
done
3.命令行傳參

命令行傳參遍歷使用固定符號$@,如果參數(shù)中有空格,用雙引號括起來,例子如下

#!/bin/bash

for i in "$@"
do
    echo $i
done
4.文件目錄

文件遍歷使用ls命令,可以指定目錄,以及通配符匹配

#!/bin/bash

for i in `ls /home/*.sh` 
do
    echo $i
done

Shell循環(huán)使用案例

(1)9 9 乘法表

一個雙重循環(huán)實現(xiàn),注意expr表達(dá)式中乘號要加轉(zhuǎn)移符

#!/bin/bash

for i in {1..9}
do
    for j in {1..9}
    do
        if [ $i -gt $j ];then
            echo -n "$i * $j = `expr $i \* $j`  "
        elif [ $i -eq $j ];then
            echo "$i * $j = `expr $i \* $j`"
        fi
    done
done

(2)將某目錄下大小大于閾值的文件移動到另一個文件
遍歷循環(huán)一個目錄,使用awk語法獲得文件大小,將100m以上的文件移動到另一個文件夾

#!/bin/bash

path='/data/input_data/'
for i in `ls ${path}`
do
        if [ -f ${path}${i} ];then
                [ `ls -l ${path}${i}|awk '{print $5}'` -gt $((100 * 1024 * 1024))  ] && mv ${path}${i} /tmp/${i} && echo "移動文件${path}${i}"
        fi
done

(2)指定開始日期和結(jié)束日期完成一個跑批任務(wù)
指定一個開始時間和結(jié)束時間,while從開始日期一直自增到結(jié)束日期循環(huán)結(jié)束,通過date -d '2021-01-01 1day' +%Y-%m-%d自增一天

#!/bin/bash

if [[ $# -ne 2 ]];then
    echo '參數(shù)個數(shù)不對'
fi

start=$1
end=$2
while [[ "$start" < "$end" ]]
do
    python job.py "$start"
    start=`date -d "$start 1day" +%Y-%m-%d`
    if [ $? -ne 0 ];then
        echo '任務(wù)報錯'
        break
    fi
done
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容