摘要: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