最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Shell編程中while與for的區(qū)別及用法詳解

 更新時間:2016年02月01日 15:06:31   投稿:mrr  
在shell編程中經(jīng)常用到循環(huán),常用的循環(huán)有for和while循環(huán)兩種。while循環(huán)默認(rèn)以行讀取文件,而for循環(huán)以空格讀取文件切分文件,本篇就結(jié)合現(xiàn)網(wǎng)的一些使用示例說說二者的用法和區(qū)別

在shell編程中經(jīng)常用到循環(huán),常用的循環(huán)有for和while循環(huán)兩種。while循環(huán)默認(rèn)以行讀取文件,而for循環(huán)以空格讀取文件切分文件,本篇就結(jié)合現(xiàn)網(wǎng)的一些使用示例說說二者的用法和區(qū)別。

一、常用語法

1、for循環(huán)

for循環(huán)常用的語法結(jié)構(gòu)有如下幾種:

for 變量 in seq字符串
for 變量 in `command` " "
for 變量 in "$@"或“$*”
for((賦值;條件;運算語句))

2、while循環(huán)

while循環(huán)常用的語法結(jié)構(gòu)有如下幾種:

while [ $i -lt num ]
while true
while read a b c; do command done < filename
cat filename | while read a b c

二、行讀取示例

這里以常見的df獲取磁盤信息為例,了解下使用for和while的幾種循環(huán)方法處理時的區(qū)別。先看下我寫的腳本,內(nèi)容如下:

#/bin/bash
## author: yangbk
## site: www.361way.com
## mail: itybku@139.com
## desc: test loop for in and while
df -hl|awk 'int($5) >30 ' > testfile
result=`df -hl|awk 'int($5) >30 '`
echo '******************* for testing *****************'
for i in $result;do
echo $i
done
echo '******************* while echo test *************'
echo $result | while read line
do
echo $line
done
echo '****************** while testing ****************'
df -hl|awk 'int($5) >30 '|while read line
do
echo $IP `hostname` $line
done
echo '****************** while read file **************'
while read line
do
echo $IP `hostname` $line
done < testfile

上面的腳本執(zhí)行時結(jié)果如下:

# sh forwhile.sh
******************* for testing *****************
/dev/sda3
9.5G
5.7G
3.4G
64%
/
/dev/sda2
39G
19G
18G
52%
/home
/dev/sda6
9.5G
7.1G
2.0G
78%
/usr
******************* while echo test *************
/dev/sda3 9.5G 5.7G 3.4G 64% / /dev/sda2 39G 19G 18G 52% /home /dev/sda6 9.5G 7.1G 2.0G 78% /usr
****************** while testing ****************
localhost /dev/sda3 9.5G 5.7G 3.4G 64% /
localhost /dev/sda2 39G 19G 18G 52% /home
localhost /dev/sda6 9.5G 7.1G 2.0G 78% /usr
****************** while read file **************
localhost /dev/sda3 9.5G 5.7G 3.4G 64% /
localhost /dev/sda2 39G 19G 18G 52% /home
localhost /dev/sda6 9.5G 7.1G 2.0G 78% /usr

可以看到,只有后面兩種方法可以正常獲取到我們想要的數(shù)據(jù),前面兩種方法在處理時和我們想要的結(jié)果都不一樣。此示例得出的結(jié)果為:

1、while循環(huán): 以行讀取文件,默認(rèn)分隔符是空格或者Tab;

2、for循環(huán): 以空格讀取文件,也就是碰到空格,就開始執(zhí)行循環(huán)體,所以需要以行讀取的話,就要把空格轉(zhuǎn)換成其他字符。

三、ssh連接與wait

這里還是以一個測試腳本為例:

#!/bin/bash
## author: yangbk
## site: www.361way.com
## mail: itybku@139.com
## desc: test wait and ssh when use for in and while
# while loop
echo -en "\t";date
cat abc.txt|while read user ip
do
{
ssh -o ConnectTimeout=10 $user@$ip "hostname" < /dev/null
sleep 10s
} &
done
wait
echo "This is while loop."
echo -en "\t";date
sleep 10s
echo -e "\n"
# for loop
echo -en "\t";date
for line in `cat abc.txt|sed -e 's/ /--/g'`
do
{
user=`echo $line|awk -F '--' '{print $1}'`
ip=`echo $line|awk -F '--' '{print $2}'`
ssh -oConnectTimeout=10 $user@$ip "hostname"
sleep 10s
} &
done
wait
echo "This is for loop."
echo -en "\t";date

此示例的結(jié)果這里不再輸出,具體可以使用該腳本ssh幾臺主機(jī)做個測試,測試后得到結(jié)果如下:

1、for循環(huán): 循環(huán)體在后臺執(zhí)行,等待循環(huán)體全部執(zhí)行結(jié)束,后面的命令接著執(zhí)行。

2、while循環(huán): wait沒起到作用,循環(huán)體在后臺執(zhí)行,后面的命令也同時在執(zhí)行。循環(huán)體內(nèi)有ssh、scp、sshpass的時候有執(zhí)行一次循環(huán)就退出的情況,解決該問題方法有如下兩種:

a、使用ssh -n "command" ;
b、將while循環(huán)內(nèi)加入null重定向,如 ssh "cmd" < /dev/null 將ssh 的輸入重定向輸入。

四、執(zhí)行效率

在對大文件進(jìn)行按行讀取(for在讀取文件時,可以for i in `cat filename`進(jìn)行按行讀?。┑男史矫?,經(jīng)測試while 要更快一些。

shell:for和while用法

寫法一:

----------------------------------------------------------------------------
#!/bin/bash

while read line
do
echo $line
done < file(待讀取的文件)
----------------------------------------------------------------------------

寫法二:(并發(fā)腳本慎用,grep不能輸出全部匹配的信息)
----------------------------------------------------------------------------
#!/bin/bash

cat file(待讀取的文件) | while read line
do
echo $line
done
----------------------------------------------------------------------------

寫法三:

----------------------------------------------------------------------------
for line in `cat file(待讀取的文件)`
do
echo $line
done
----------------------------------------------------------------------------

說明:

for逐行讀和while逐行讀是有區(qū)別的,如:

$ cat file
aaaa
bbbb fff ggg
cccc dddd
$ cat file | while read line; do echo $line; done
aaaa
bbbb fff ggg
cccc dddd
$ for line in $(<file); do echo $line; done
aaaa
bbbb
fff
ggg
cccc
dddd

相關(guān)文章

  • nvidia-smi命令詳解和一些高階技巧講解

    nvidia-smi命令詳解和一些高階技巧講解

    一般情況下用的比較多的就是nvidia-smi的命令,其實掌握了這一個命令也就能夠覆蓋絕大多數(shù)場景了,但是本質(zhì)求真務(wù)實的態(tài)度,本文調(diào)研了相關(guān)資料,整理了一些比較常用的nvidia-smi命令的其他用法,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • 在Shell腳本中調(diào)用另一個腳本的三種方式講解

    在Shell腳本中調(diào)用另一個腳本的三種方式講解

    今天小編就為大家分享一篇關(guān)于在Shell腳本中調(diào)用另一個腳本的三種方式講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • linux shell 邏輯運算符、邏輯表達(dá)式詳細(xì)介紹

    linux shell 邏輯運算符、邏輯表達(dá)式詳細(xì)介紹

    shell的邏輯運算符 涉及有以下幾種類型,因此只要適當(dāng)選擇,可以解決我們很多復(fù)雜的判斷,達(dá)到事半功倍效果
    2014-02-02
  • Shell腳本read用法實現(xiàn)

    Shell腳本read用法實現(xiàn)

    本文主要介紹了Shell腳本read用法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Linux 下sudo網(wǎng)絡(luò)權(quán)限詳解

    Linux 下sudo網(wǎng)絡(luò)權(quán)限詳解

    這篇文章主要介紹了Linux 下sudo網(wǎng)絡(luò)權(quán)限詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • linux下shell腳本備份文件的方法實現(xiàn)

    linux下shell腳本備份文件的方法實現(xiàn)

    本文主要介紹了linux下shell腳本備份文件的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • shell腳本學(xué)習(xí)指南[六](Arnold Robbins & Nelson H.F. Beebe著)

    shell腳本學(xué)習(xí)指南[六](Arnold Robbins & Nelson H

    這篇文章主要介紹了shell腳本學(xué)習(xí)指南[六](Arnold Robbins & Nelson H.F. Beebe著),需要的朋友可以參考下
    2014-02-02
  • 詳解Linux--shell腳本之正則表達(dá)式

    詳解Linux--shell腳本之正則表達(dá)式

    本篇文章主要介紹了Linux--shell腳本之正則表達(dá)式,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Linux shell知識點匯總

    Linux shell知識點匯總

    從程序員的角度來看, Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用 Shell腳本編程,完成更加復(fù)雜的操作。
    2015-08-08
  • 在Shell命令行處理JSON數(shù)據(jù)的方法

    在Shell命令行處理JSON數(shù)據(jù)的方法

    這篇文章主要介紹了在Shell命令行處理JSON數(shù)據(jù)的方法,使用jq工具實現(xiàn),需要的朋友可以參考下
    2014-03-03

最新評論

济阳县| 乌兰浩特市| 阳泉市| 灵山县| 泰来县| 桐乡市| 纳雍县| 滦南县| 大邑县| 富川| 玉环县| 修水县| 揭西县| 石渠县| 板桥市| 吴江市| 资兴市| 广东省| 神农架林区| 二连浩特市| 勐海县| 申扎县| 巍山| 武清区| 竹北市| 静海县| 曲阳县| 沙田区| 石景山区| 兴隆县| 两当县| 云安县| 福安市| 维西| 康马县| 慈利县| 黑山县| 榆林市| 铅山县| 巩留县| 黄梅县|