日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux控制流程,Linux-流程控制:for 循环

發布時間:2025/4/17 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux控制流程,Linux-流程控制:for 循环 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在這關于流程控制的最后一章中,我們將看看另一種 shell 循環構造。for 循環不同于 while 和 until 循環,因為 在循環中,它提供了一種處理序列的方式。這在編程時非常有用。因此在 bash 腳本中,for 循環是非常流行的構造。

實現一個 for 循環,很自然的,要用 for 命令。在現代版的 bash 中,有兩種可用的 for 循環格式。

for: 傳統 shell 格式

原來的 for 命令語法是:

for variable [in words]; do

commands

done

這里的 variable 是一個變量的名字,這個變量在循環執行期間會增加,words 是一個可選的條目列表, 其值會按順序賦值給 variable,commands 是在每次循環迭代中要執行的命令。

在命令行中 for 命令是很有用的。我們可以很容易的說明它是如何工作的:

[me@linuxbox ~]$ for i in A B C D; do echo $i; done

A

B

C

D

在這個例子中,for 循環有一個四個單詞的列表:“A”,“B”,“C”,和 “D”。由于這四個單詞的列表,for 循環會執行四次。 每次循環執行的時候,就會有一個單詞賦值給變量 i。在循環體內,我們有一個 echo 命令會顯示 i 變量的值,來演示賦值結果。 正如 while 和 until 循環,done 關鍵字會關閉循環。

for 命令真正強大的功能是我們可以通過許多有趣的方式創建 words 列表。例如,通過花括號展開:

[me@linuxbox ~]$ for i in {A..D}; do echo $i; done

A

B

C

D

或者路徑名展開:

[me@linuxbox ~]$ for i in distros*.txt; do echo $i; done

distros-by-date.txt

distros-dates.txt

distros-key-names.txt

distros-key-vernums.txt

distros-names.txt

distros.txt

distros-vernums.txt

distros-versions.txt

或者命令替換:

#!/bin/bash

# longest-word : find longest string in a file

while [[ -n $1 ]]; do

if [[ -r $1 ]]; thenmax_word=

max_len=0

fori in $(strings $1); dolen=$(echo $i | wc -c)

if (( len > max_len )); thenmax_len=$len

max_word=$i

fi

doneecho "$1: '$max_word' ($max_lencharacters)"

fishiftdone

在這個示例中,我們要在一個文件中查找最長的字符串。當在命令行中給出一個或多個文件名的時候, 該程序會使用 strings 程序(其包含在 GNU binutils 包中),為每一個文件產生一個可讀的文本格式的 “words” 列表。 然后這個 for 循環依次處理每個單詞,判斷當前這個單詞是否為目前為止找到的最長的一個。當循環結束的時候,顯示出最長的單詞。

如果省略掉 for 命令的可選項 words 部分,for 命令會默認處理位置參數。 我們將修改 longest-word 腳本,來使用這種方式:

#!/bin/bash

# longest-word2 : find longest string in a file

fori; do

if [[ -r $i ]]; thenmax_word=

max_len=0

forj in $(strings $i); dolen=$(echo $j | wc -c)

if (( len > max_len )); thenmax_len=$len

max_word=$j

fi

doneecho "$i: '$max_word' ($max_lencharacters)"

fi

done

正如我們所看到的,我們已經更改了最外圍的循環,用 for 循環來代替 while 循環。通過省略 for 命令的 words 列表, 用位置參數替而代之。在循環體內,之前的變量 i 已經改為變量 j。同時 shift 命令也被淘汰掉了。

為什么是 i?

你可能已經注意到上面所列舉的 for 循環的實例都選擇 i 作為變量。為什么呢? 實際上沒有具體原因,除了傳統習慣。 for 循環使用的變量可以是任意有效的變量,但是 i 是最常用的一個,其次是 j 和 k。

這一傳統的基礎源于 Fortran 編程語言。在 Fortran 語言中,以字母 I,J,K,L 和 M 開頭的未聲明變量的類型 自動設為整形,而以其它字母開頭的變量則為實數類型(帶有小數的數字)。這種行為導致程序員使用變量 I,J,和 K 作為循環變量, 因為當需要一個臨時變量(正如循環變量)的時候,使用它們工作量比較少。這也引出了如下基于 fortran 的俏皮話:

“神是實數,除非是聲明的整數。”

for: C 語言格式

最新版本的 bash 已經添加了第二種格式的 for 命令語法,該語法相似于 C 語言中的 for 語法格式。 其它許多編程語言也支持這種格式:

for (( expression1; expression2; expression3 )); do

commands

done

這里的 expression1,expression2,和 expression3 都是算術表達式,commands 是每次循環迭代時要執行的命令。 在行為方面,這相當于以下構造形式:

(( expression1 ))

while (( expression2 )); do

commands

(( expression3 ))

done

expression1 用來初始化循環條件,expression2 用來決定循環結束的時間,還有在每次循環迭代的末尾會執行 expression3。

這里是一個典型應用:

#!/bin/bash

# simple_counter : demo of C style for command

for (( i=0; i<5; i=i+1 )); doecho $i

done

腳本執行之后,產生如下輸出:

[me@linuxbox ~]$ simple_counter

0

1

2

3

4

在這個示例中,expression1 初始化變量 i 的值為0,expression2 允許循環繼續執行只要變量 i 的值小于5, 還有每次循環迭代時,expression3 會把變量 i 的值加1。

C 語言格式的 for 循環對于需要一個數字序列的情況是很有用處的。我們將在接下來的兩章中看到幾個這樣的應用實例。

總結

學習了 for 命令的知識,現在我們將對我們的 sys_info_page 腳本做最后的改進。 目前,這個 report_home_space 函數看起來像這樣:

report_home_space () {

if [[ $(id -u) -eq 0 ]]; then

cat <

Home Space Utilization (All Users)

$(du -sh /home/*)

_EOF_

else

cat <

Home Space Utilization ($USER)

$(du -sh $HOME)

_EOF_

fi

return

}

下一步,我們將重寫它,以便提供每個用戶家目錄的更詳盡信息,并且包含用戶家目錄中文件和目錄的總個數:

report_home_space () {

local format="%8s%10s%10s\n"

local i dir_list total_files total_dirs total_size user_name

if [[ $(id -u) -eq 0 ]]; then

dir_list=/home/*

user_name="All Users"

else

dir_list=$HOME

user_name=$USER

fi

echo "

Home Space Utilization ($user_name)

"

for i in $dir_list; do

total_files=$(find $i -type f | wc -l)

total_dirs=$(find $i -type d | wc -l)

total_size=$(du -sh $i | cut -f 1)

echo "

$i

"

echo "

"

printf "$format" "Dirs" "Files" "Size"

printf "$format" "----" "-----" "----"

printf "$format" $total_dirs $total_files $total_size

echo "

"

done

return

}

這次重寫應用了目前為止我們學過的許多知識。我們仍然測試超級用戶(superuser),但是我們在 if 語句塊內 設置了一些隨后會在 for 循環中用到的變量,來取代在 if 語句塊內執行完備的動作集合。我們給 函數添加了幾個本地變量,并且使用 printf 來格式化輸出。

拓展閱讀

分享到:

總結

以上是生活随笔為你收集整理的linux控制流程,Linux-流程控制:for 循环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。