shell for迴圈 乙個小白,他能逆襲嗎?

2022-09-23 02:21:11 字數 4233 閱讀 6934

除了 while 迴圈和 until 迴圈,shell 指令碼還提供了 for 迴圈,它更加靈活易用,更加簡潔明瞭。shell?for 迴圈有兩種使用形式,下面我們逐一講解。

c語言風格的 for 迴圈

c語言風格的 for 迴圈的用法如下:

for((exp1; exp2; exp3))do??? statementsdone

幾點說明:

exp1、exp2、exp3 是三個表示式,其中 exp2 是判斷條件,for 迴圈根據 exp2 的結果來決定是否繼續下一次迴圈;statements 是迴圈體語句,可以有一條,也可以有多條;do 和 done 是 shell 中的關鍵字。

它的執行過程為:1) 先執行 exp1。

2) 再執行 exp2,如果它的判斷結果是成立的,則執行迴圈體中的語句,否則結束整個 for 迴圈。

3) 執行完迴圈體後再執行 exp3。

4) 重複執行步驟 2) 和 3),直到 exp2 的判斷結果不成立,就結束迴圈。

上面的步驟中,2) 和 3) 合併在一起算作一次迴圈,會重複執行,for 語句的主要作用就是不斷執行步驟 2) 和 3)。

exp1 僅在第一次迴圈時執行,以後都不會再執行,可以認為這是乙個初始化語句。exp2 一般是乙個關係表示式,決定了是否還要繼續下次迴圈,稱為「迴圈條件」。exp3 很多情況下是乙個帶有自增或自減運算的表示式,以使迴圈條件逐漸變得「不成立」。

for 迴圈的執行過程可用下圖表示:

下面我們給出乙個實際的例子,計算從 1 加到 100 的和。

#!/bin/bash

sum=0

for ((i=1; i<=100; i++))do((sum += i))done

echo "the sum is: $sum"

執行結果:the sum is: 5050

**分析:1) 執行到 for 語句時,先給變數 i 賦值為 1,然後判斷 i<=100 是否成立;因為此時 i=1,所以 i<=100 成立。接下來會執行迴圈體中的語句,等迴圈體執行結束後(sum 的值為1),再計算 i++。

2) 第二次迴圈時,i 的值為2,i<=100 成立,繼續執行迴圈體。迴圈體執行結束後(sum的值為3),再計算 i++。

3) 重複執行步驟 2),直到第 101 次迴圈,此時 i 的值為 101,i<=100 不再成立,所以結束迴圈。

由此我們可以總結出 for 迴圈的一般形式為:

for(( 初始化語句; 判斷條件; 自增或自減 ))do? ? statementsdone

for 迴圈中的三個表示式

for 迴圈中的 exp1(初始化語句)、exp2(判斷條件)和 exp3(自增或自減)都是可選項,都可以省略(但分號;必須保留)。

1) 修改「從 1 加到 100 的和」的**,省略 exp1:#!/bin/bash

sum=0i=1

for ((; i<=100; i++))do((sum += i))done

echo "the sum is: $sum

"可以看到,將i=1移到了 for 迴圈的外面。

2) 省略 exp2,就沒有了判斷條件,如果不作其他處理就會成為死迴圈,我們可以在迴圈體內部使用 break 關鍵字強制結束迴圈:#!/bin/bash

sum=0

for ((i=1; ; i++))doif(( i>100 )); thenbreakfi((sum += i))done

echo "the sum is: $sum"

break 是 shell 中的關鍵字,專門用來結束迴圈,後續章節還會深入講解。

3) 省略了 exp3,就不會修改 exp2 中的變數,這時可在迴圈體中加入修改變數的語句。例如:

#!/bin/bash

sum=0

for ((i=1; i<=100; ))do((sum += i))((i++))done

echo "the sum is: $sum"

4) 最後給大家看乙個更加極端的例子,同時省略三個表示式:

#!/bin/bash

sum=0i=0

for (( ; ; ))doif(( i>100 )); thenbreakfi((sum += i))((i++))done

echo "the sum is: $sum"

這種寫法並沒有什麼實際意義,僅僅是為了給大家做演示。

python?風格的 for in 迴圈

python 風格的 for in 迴圈的用法如下:

for?variable in value_listdo??? statementsdone

variable 表示變數,value_list 表示取值列表,in 是 shell 中的關鍵字。

in value_list 部分可以省略,省略後的效果相當於 in $@,本文末尾的「value_list 使用特殊變數」將會詳細講解。

每次迴圈都會從?value_list 中取出乙個值賦給變數?variable,然後進入迴圈體(do 和 done 之間的部分),執行迴圈體中的?statements。直到取完?value_list 中的所有值,迴圈就結束了。

shell for in 迴圈舉例:

?#!/bin/bash

sum=0

for n in 1 2 3 4 5 6doecho $n((sum+=n))done

echo "the sum is "$sum

執行結果:123456the sum is 21

對?value_list 的說明

取值列表 value_list 的形式有多種,你可以直接給出具體的值,也可以給出乙個範圍,還可以使用命令產生的結果,甚至使用萬用字元,下面我們一一講解。

1) 直接給出具體的值

可以在 in 關鍵字後面直接給出具體的值,多個值之間以空格分隔,比如1 2 3 4 5、"abc" "390" "tom"等。

上面的**中用一組數字作為取值列表,下面我們再演示一下用一組字串作為取值列表:

?#!/bin/bash

for i in "abc" "123" "qwe" "我愛你"doecho $idone執行結果:abc

qwe我愛你

2) 給出乙個取值範圍

給出乙個取值範圍的具體格式為:

start 表示起始值,end 表示終止值;注意中間用兩個點號相連,而不是三個點號。根據筆者的實測,這種形式只支援數字和字母。

例如,計算從 1 加到 100 的和:

?#!/bin/bash

sum=0

for n in do((sum+=n))done

echo $sum

執行結果:5050

再如,輸出從 a 到 z 之間的所有字元:

?#!/bin/bash

for c in doprintf "%c" $cdone

輸出結果:abcdefghijklmnopqrstuvwxyz^_`abcdefghijklmnopqrstuvwxyz

可以發現,shell 是根據?ascii?碼表來輸出的。

3) 使用命令的執行結果

使用反引號``或者$()都可以取得命令的執行結果,我們在《shell變數》一節中已經進行了詳細講解,並對比了兩者的優缺點。本節我們使用$()這種形式,因為它不容易產生混淆。

例如,計算從 1 到 100 之間所有偶數的和:

?#!/bin/bash

sum=0

for n in $(seq 2 2 100)do((sum+=n))done

echo $sum

執行結果:2550

seq 是乙個?linux 命令,用來產生某個範圍內的整數,並且可以設定步長,不了解的讀者請自行百度。seq 2 2 100表示從 2 開始,每次增加 2,到 100 結束。

再如,列出當前目錄下的所有 shell 指令碼檔案:

?#!/bin/bash

for filename in $(ls *.sh)doecho $filenamedone

執行結果:demo.shtest.shabc.sh

ls 是乙個?linux?命令,用來列出當前目錄下的所有檔案,*.sh表示匹配字尾為.sh的檔案,也就是 shell 指令碼檔案。

4) 使用 shell 萬用字元

shell 萬用字元可以認為是一種精簡化的正規表示式,通常用來匹配目錄或者檔案,而不是文字,不了解的讀者請猛擊《linux shell 萬用字元(glob 模式)》。

?#!/bin/bash

for filename in *.shdoecho $filenamedone

執行結果:demo.shtest.shabc.sh

shell grep命令 乙個小白,他能逆襲嗎?

作為linux中最為常用的三大文字 awk,sed,grep 處理工具之一,掌握好其用法是很有必要的。首先談一下grep命令的常用格式為 grep 選項 模式 檔案 grep家族總共有三個 grep,egrep,fgrep。常用選項 e 開啟擴充套件 extend 的正規表示式。i 忽略大小寫 ig...

Redis持久化 乙個小白,他能逆襲嗎?

redis持久化 持久化概述 redis是執行在記憶體中,記憶體中的資料斷電丟失 為了能夠重用redis資料,或者防止系統故障,我們需要將redis中的資料寫入到磁碟空間中,即持久化 持久化分類重點 rdb方式 建立快照的方式獲取某一時刻redis中所有 資料的副本 aof方式 將執行的寫命令寫到檔...

乙個小白的最基礎C語言迴圈巢狀

題目描述 給定乙個n階矩陣a,輸出a的m次冪 m是非負整數 例如 a a的2次冪 輸入第一行是乙個正整數n m 1 n 30,0 m 5 表示矩陣a的階數和要求的冪數,接下來n行,每行n個絕對值不超過10的非負整數,描述矩陣a的值。輸出輸出共n行,每行n個整數,表示a的m次冪所對應的矩陣。相鄰的數之...