Linux?shell之for?in的使用及說(shuō)明
一、語(yǔ)法
for 變量名 in 列表
do
程序段(command)
done注意1:是變量名而不是$變量!
注意2:列表可以做文章!
二、應(yīng)用
第一類(lèi):數(shù)字性循環(huán)-->seq在in后面的應(yīng)用
#!/bin/bash
#也是產(chǎn)生等差數(shù)列-->默認(rèn)是1
for i in $(seq 1 10) #產(chǎn)生的是一個(gè)字符串,默認(rèn)IFS是以空格隔開(kāi)!
do
echo $(expr $i \* 3 + 1); #主要是復(fù)習(xí):expr乘法的特殊用法!-->空格隔開(kāi)
done 補(bǔ)充:產(chǎn)生[1,10]的自然數(shù)-->{}在in后面的應(yīng)用
total=0 #全局變量
for i in {1..100} #".."表示連續(xù),默認(rèn)也是IFS為空格隔開(kāi)
do
((total+=i))
done
echo -e "total is:${total}"
#多行注釋
<<COMMENR
for i in mysql_{0,1,4,12}sql #多個(gè)文件
do
echo $i
samtools view -c $i
done
COMMENT第二類(lèi):字符性循環(huán)
最原始的
#!/bin/bash
#使用列表for循環(huán)顯示周一到周日對(duì)應(yīng)的英文-->學(xué)習(xí)日期的英文
for day in Monday Tuesday Wednesday Thursday Friday Saturday Sunday
do
echo "$day"
done變量的類(lèi)型
#!/bin/bash
list="Linux Java C++ Python"
for i in $list
do
echo -e "Language is ${i}"
done cat在in后面的應(yīng)用-->逐行讀取文件的內(nèi)容(默認(rèn)是IFS),所以不是逐行打印!
#!/bin/bash for i in $(cat 日志顏色.sh) #注意:pwd當(dāng)前目錄下的文件 do echo $i done
思考:如果想逐行原樣輸出!
#!/bin/bash
# reading content from a file
file="日志文件.sh"
#將這個(gè)語(yǔ)句加入到腳本中,告訴bash shell在數(shù)據(jù)值中忽略空格和制表,使其只能識(shí)別換行符!
IFS=$'\n'
for std in $(cat $file)
do
echo "$std"
done說(shuō)明:IFS的一些說(shuō)明!
- bash shell會(huì)將下列字符當(dāng)作字段分隔符:空格、制表符、換行符
- 說(shuō)明:如果在shell在數(shù)據(jù)中看到這些字符中的任意一個(gè),它就會(huì)假定這表明了列表中一個(gè)新數(shù)據(jù)字段的開(kāi)始!
參考的最佳安全實(shí)踐:在改變IFS之前保存原來(lái)的IFS值,之后再恢復(fù)它。
保證了:在腳本的后續(xù)操作中使用的是IFS的默認(rèn)值
實(shí)現(xiàn):
IFS.OLD=$IFS #默認(rèn)的IFS的數(shù)值-->也是環(huán)境變量! IFS=$'\n' #自定義的IFS數(shù)值 <在代碼中使用新的IFS值> #待使用自定義IFS的部分! IFS=$IFS.OLD #恢復(fù)默認(rèn)的IFS
第三類(lèi):路徑查找
ls在in后面的命令是-->讀取當(dāng)前pwd下的文件(廣義上)!
#!/bin/bash
for i in `ls`; #ls可以結(jié)合統(tǒng)配符應(yīng)用!
do
echo $i is file name\! ; #注意:\的應(yīng)用!
done 用通配符讀取目錄(無(wú)命令)
for file in ~/*; #一級(jí)目錄下的內(nèi)容-->并不遞歸顯示!
do
echo $file is file path \! ; #${file}代表的是文件的全路徑
done #!/bin/bash
#回憶1:統(tǒng)計(jì)腳本參數(shù)的個(gè)數(shù)
echo "argument number are $#"!
#回憶2:參數(shù)的內(nèi)容-->此處可以換成$@來(lái)測(cè)試!
echo "the input is $*"
#循環(huán)執(zhí)行
for argument in "$*";
do
echo "$argument "
doneIFS:內(nèi)部字段分隔符
需求如下:
#遍歷一個(gè)文件中用冒號(hào)分隔的值:-->特殊文件-->/etc/passwd文件等! IFS=: #如果要指定多個(gè)IFS字符,只要將它們?cè)谫x值行串起來(lái)就行。 IFS=$'\n':;"
總結(jié)
#(1)從變量讀取列表 # 將一系列的值都集中存儲(chǔ)在一個(gè)變量中,然后需要遍歷變量中的整個(gè)列表 #(2)從命令讀取值 #有兩種方式可以將命令輸出賦值給變量: # (1)反引號(hào)字符(`) # (2)$()格式
補(bǔ)充:在列表構(gòu)成上分多種情景,如數(shù)字列表、字符串列表、命令列表、腳本傳參列表等!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
shell通過(guò)遍歷輸出兩個(gè)日期范圍內(nèi)所有日期的方法
這篇文章主要介紹了在shell通過(guò)遍歷輸出兩個(gè)日期范圍內(nèi)所有日期的方法,文中給出了詳細(xì)的示例代碼以及實(shí)現(xiàn)思路流程,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06
Ansible?Ad-hoc命令執(zhí)行模塊實(shí)戰(zhàn)教程
Ad-hoc是Ansible下臨時(shí)執(zhí)行的一條命令,對(duì)于復(fù)雜的命令會(huì)使用playbook。Ad-hoc的執(zhí)行依賴(lài)于模塊,ansible官方提供了大量的模塊,這篇文章主要介紹了Ansible?Ad-hoc命令執(zhí)行模塊?,需要的朋友可以參考下2024-02-02
關(guān)于ssh連不上問(wèn)題的解決方法(必看)
下面小編就為大家?guī)?lái)一篇關(guān)于ssh連不上問(wèn)題的解決方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
linux?shell文件轉(zhuǎn)碼iconv命令的使用
本文主要介紹了linux?shell文件轉(zhuǎn)碼iconv命令的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Linux 壓縮某個(gè)文件夾的實(shí)現(xiàn)方法
這篇文章主要介紹了Linux 壓縮某個(gè)文件夾的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
Shell腳本中實(shí)現(xiàn)切換用戶(hù)并執(zhí)行命令操作
這篇文章主要介紹了Shell腳本中實(shí)現(xiàn)切換用戶(hù)并執(zhí)行命令操作,看了示例代碼就秒懂了,原來(lái)如此簡(jiǎn)單,需要的朋友可以參考下2014-12-12
獲取磁盤(pán)IO與系統(tǒng)負(fù)載Load的shell腳本
本節(jié)介紹的幾段shell腳本,可以用于提取磁盤(pán)的I/O信息,系統(tǒng)負(fù)載Load信息等2013-08-08

