網(wǎng)站首頁 編程語言 正文
1. for 命令
1.1 for 命令的使用
bash shell 提供了
for
命令,可以創(chuàng)建一個遍歷一系列值的循環(huán)。每次一輪循環(huán)都使用其中一個值來執(zhí)行已定義好的一組命令。下面是 bash shell 中for
命令的基本格式。
for var in list do commands done 還可以是這樣的形式 for var in list; do
注意這里的
list
這不是 shell 的關(guān)鍵詞,list 只是想說明這是由數(shù)值,字符,字符串所組成的列表,for 循環(huán)來遍歷這個列表。
使用:
for i in a b c d e f do echo "The char is: $i" done ------------------------------ The char is: a The char is: b The char is: c The char is: d The char is: e The char is: f
for name in Alabama Alaska Arizona Arkansas California Colorado do echo The next state is $name done --------------------------------------------------------------- The next state is Alabama The next state is Alaska The next state is Arizona The next state is Arkansas The next state is California The next state is Colorado
還可以在變量中加載值:
通常shell腳本遇到的情況是,你將一系列值都集中存儲在了一個變量中,然后需要遍歷變量中的整個列表。
str="hello, word" for s in str do echo "$s" done
還可以在命令中加載值:
生成列表中所需值的另外一個途徑就是使用命令的輸出。可以用命令替換來執(zhí)行任何能產(chǎn)生輸出的命令,然后在 for 命令中使用該命令的輸出。
file="file_name" for f in $(cat $file) do echo "$f" done
1.2 for 命令面臨的問題
for 循環(huán)可以遍歷字符串列表,比如
Alabama Alaska Arizona Arkansas California Colorado
,這很簡單,但是如果字符串中夾雜著特殊字符,比如這樣this'll
那這就有些麻煩了,因為有些特殊字符在 shell 中存在其他的含義。為了解決這樣的問題,字符串中需要加入反斜杠\
進行轉(zhuǎn)義,比如這樣this\'ll
。這時 shell 就可以識別出特殊字符了。
還有一個辦法是將含有特殊字符的字符串使用雙引號括起來,比如像這樣"this'll"
。
例如:
for s in I don\'t know if "this'll" work do echo "word:$s" done
1.3 更改字段分隔符
為什么需要更改字段分隔符呢?如果你需要輸出一篇英文文章,英文文章內(nèi)容自然存在單詞間的空格,行與行之間的換行符,現(xiàn)在如果shell輸出內(nèi)容的字段分隔符是空格,那這會存在一個問題,就是輸出內(nèi)容時內(nèi)容會排成一列,而不是一行一行的輸出。造成這個問題的原因是特殊的環(huán)境變量 IFS ,叫作內(nèi)部字段分隔符(internal field separator)。IFS 環(huán)境變量定義了bash shell用作字段分隔符的一系列字符。默認情況下,bash shell會將下列字符當作字段分隔符:
- 空格
- 制表符
- 換行符
如果bash shell在數(shù)據(jù)中看到以上這些字符中的任意一個,它就會假定這表明了列表中一個新數(shù)據(jù)字段的開始。
要解決這個問題,可以在 shell 腳本中臨時更改 IFS 環(huán)境變量的值來限制被 bash shell 當作字段分隔符的字符,比如
IFS=$'\n'
,這樣字段分隔符就被更改為換行了。這樣 bash shell 就認為換行才是數(shù)據(jù)的結(jié)束,bash shell 會在數(shù)據(jù)值中忽略空格和制表符。
就像下面這樣存儲舊值,賦予臨時修改值:
file="file_name" IFS.OLD=$IFS IFS=$'\n' for f in $(cat $file) do echo "$f" done IFS=$IFS.OLD
1.4 用通配符讀取目錄
可以用 for 命令來自動遍歷目錄中的文件。進行此操作時,必須在文件名或路徑名中使用通配符。它會強制shell 使用文件擴展匹配。文件擴展匹配是生成匹配指定通配符的文件名或路徑名的過程。在不知道所有的文件名,這個特性在處理目錄中的文件時就非常有用。
從目錄中加載出所有的文件和文件夾:
for file in /home/rich/test/* do if [ -d "$file" ] then echo "$file is a directory" elif [ -f "$file" ] then echo "$file is a file" fi done
2. c 風格 for 命令
我們先來看看 C 語言代碼中 for 循環(huán)的代碼風格:
for (i = 0; i < 10; i++) { printf("The next number is %d\n", i); }
以下是 bash shell 中 C 語言風格的 for 循環(huán)的基本格式:
for (( variable assignment ; condition ; iteration process )) ↓↓↓ for (( a = 1; a < 10; a++ ))
C語言風格的 for 循環(huán)的格式會讓 bash shell 腳本程序員摸不著頭腦,因為它使用了C語言風格
的變量引用方式而不是shell風格的變量引用方式。
注意,有些部分并沒有遵循 bash shell 標準的 for 命令:變量賦值可以有空格
條件中的變量不以美元符開頭
迭代過程的算式未用 expr 命令格式
使用 C 風格的 for 命令可以像 C 語言那樣使用多個變量,例如下面這樣:
for (( a=1, b=10; a <= 10; a++, b-- )) do echo "$a - $b" done
3. while 命令
while 命令的關(guān)鍵在于所指定的 test command 的退出狀態(tài)碼必須隨著循環(huán)中運行的命令而改變。如果退出狀態(tài)碼不發(fā)生變化, while 循環(huán)就將一直不停地進行下去。最常見的 test command 的用法是用方括號來檢查循環(huán)命令中用到的shell變量的值。
while test command do other commands done
實例:
while [ $a -gt 0 ] do echo $a a=$[ $a - 1 ] done
while 還可以haike使用多個測試命令
while 命令允許你在 while 語句行定義多個測試命令。只有最后一個測試命令的退出狀態(tài)碼會被用來決定什么時候結(jié)束循環(huán)。
while echo $a [ $a -ge 0 ] do echo "This is inside the loop" a=$[ $a - 1 ] done
4. until 命令
until
命令和while
命令工作的方式完全相反。until
命令要求你指定一個通常返回非零退出狀態(tài)碼的測試命令。只有測試命令的退出狀態(tài)碼不為 0 ,bash shell 才會執(zhí)行循環(huán)中列出的命令。一旦測試命令返回了退出狀態(tài)碼 0 ,循環(huán)就結(jié)束了。
until test command do other commands done
實例:
until [ $a -eq 0 ] do echo $a a=$[ $a - 25 ] done
5. 控制循環(huán)
有時我們在腳本中執(zhí)行循環(huán)的過程中,我們需要根據(jù)特定的條件來及時的退出循環(huán)去執(zhí)行其他的任務(wù),所以我們要能夠?qū)ρh(huán)進行條件上的控制,shell 中
break
命令,continue
命令能幫我們控制循環(huán)內(nèi)部的情況。
5.1. break 命令
break 命令是退出循環(huán)的一個簡單方法。可以用 break 命令來退出任意類型的循環(huán),包括 while 和 until 循環(huán)。
在 shell 執(zhí)行 break 命令時,它會嘗試跳出當前正在執(zhí)行的循環(huán)。
有時你在內(nèi)部循環(huán),但需要停止外部循環(huán)。break
命令接受單個命令行參數(shù)值,break n
其中 n 指定了要跳出的循環(huán)層級。默認情況下, n 為 1 ,表明跳出的是當前的循環(huán)。如果你將 n 設(shè)為 2 , break 命令就會停止下一級的外部循環(huán)。
5.2. continue命令
continue
命令可以提前中止某次循環(huán)中的命令,但并不會完全終止整個循環(huán)。比如提前終止本次循環(huán),進入下一次循環(huán)(當 shell 執(zhí)行 continue 命令時,它跳過了 while 循環(huán)中余下的命令)。
原文鏈接:https://blog.csdn.net/jf_52001760/article/details/121450578
相關(guān)推薦
- 2022-11-03 Python中的def?__init__(?)函數(shù)_python
- 2022-09-26 ASP.NET?MVC打印表格并實現(xiàn)部分視圖表格打印_實用技巧
- 2024-03-08 Spring bean的實例化方式之靜態(tài)工廠和實例工廠的區(qū)別
- 2022-11-30 Python?fire模塊(最簡化命令行生成工具)的使用教程詳解_python
- 2022-04-22 Android ScrollView充滿屏幕
- 2022-06-26 C++中declspec(dllexport)和declspec(dllimport)?的用法介紹_
- 2022-09-30 詳解OpenCV執(zhí)行連通分量標記的方法和分析_python
- 2022-05-08 Python+matplotlib實現(xiàn)堆疊圖的繪制_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支