偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

你所不了解的Bash:關(guān)于Bash數(shù)組的介紹

系統(tǒng) Linux
盡管軟件工程師常常使用命令行來進行各種開發(fā),但命令行中的數(shù)組似乎總是一個模糊的東西(雖然不像正則操作符 =~ 那么復(fù)雜隱晦)。除開隱晦和有疑問的語法,Bash 數(shù)組其實是非常有用的。

[[236575]]

進入這個古怪而神奇的 Bash 數(shù)組的世界。

盡管軟件工程師常常使用命令行來進行各種開發(fā),但命令行中的數(shù)組似乎總是一個模糊的東西(雖然不像正則操作符 =~ 那么復(fù)雜隱晦)。除開隱晦和有疑問的語法,Bash 數(shù)組其實是非常有用的。

 

稍等,這是為什么?

寫 Bash 相關(guān)的東西很難,但如果是寫一篇像手冊那樣注重怪異語法的文章,就會非常簡單。不過請放心,這篇文章的目的就是讓你不用去讀該死的使用手冊。

 

真實(通常是有用的)示例

為了這個目的,想象一下真實世界的場景以及 Bash 是怎么幫忙的:你正在公司里面主導(dǎo)一個新工作,評估并優(yōu)化內(nèi)部數(shù)據(jù)管線的運行時間。首先,你要做個參數(shù)掃描分析來評估管線使用線程的狀況。簡單起見,我們把這個管道當(dāng)作一個編譯好的 C++ 黑盒子,這里面我們能夠調(diào)整的唯一的參數(shù)是用于處理數(shù)據(jù)的線程數(shù)量:./pipeline --threads 4。

 

基礎(chǔ)

我們首先要做的事是定義一個數(shù)組,用來容納我們想要測試的 --threads 參數(shù):

  1. allThreads=(1 2 4 8 16 32 64 128)

本例中,所有元素都是數(shù)字,但參數(shù)并不一定是數(shù)字,Bash 中的數(shù)組可以容納數(shù)字和字符串,比如 myArray=(1 2 "three" 4 "five") 就是個有效的表達式。就像 Bash 中其它的變量一樣,確保賦值符號兩邊沒有空格。否則 Bash 將會把變量名當(dāng)作程序來執(zhí)行,把 = 當(dāng)作程序的***個參數(shù)。

現(xiàn)在我們初始化了數(shù)組,讓我們解析它其中的一些元素。僅僅輸入 echo $allThreads ,你能發(fā)現(xiàn),它只會輸出***個元素。

要理解這個產(chǎn)生的原因,需要回到上一步,回顧我們一般是怎么在 Bash 中輸出變量??紤]以下場景:

  1. type="article"
  2. echo "Found 42 $type"

假如我們得到的變量 $type 是一個單詞,我們想要添加在句子結(jié)尾一個 s。我們無法直接把 s 加到 $type 里面,因為這會把它變成另一個變量,$types。盡管我們可以利用像 echo "Found 42 "$type"s" 這樣的代碼形變,但解決這個問題的***方法是用一個花括號:echo "Found 42 ${type}s",這讓我們能夠告訴 Bash 變量名的起止位置(有趣的是,JavaScript/ES6 在 template literals 中注入變量和表達式的語法和這里是一樣的)

事實上,盡管 Bash 變量一般不用花括號,但在數(shù)組中需要用到花括號。這反而允許我們指定要訪問的索引,例如 echo ${allThreads[1]} 返回的是數(shù)組中的第二個元素。如果不寫花括號,比如 echo $allThreads[1],會導(dǎo)致 Bash 把 [1] 當(dāng)作字符串然后輸出。

是的,Bash 數(shù)組的語法很怪,但是至少他們是從 0 開始索引的,不像有些語言(說的就是你,R 語言)。

 

遍歷數(shù)組

上面的例子中我們直接用整數(shù)作為數(shù)組的索引,我們現(xiàn)在考慮兩種其他情況:***,如果想要數(shù)組中的第 $i 個元素,這里 $i 是一個代表索引的變量,我們可以這樣 echo ${allThreads[$i]} 解析這個元素。第二,要輸出一個數(shù)組的所有元素,我們把數(shù)字索引換成 @ 符號(你可以把 @ 當(dāng)作表示 all 的符號):echo ${allThreads[@]}

 

遍歷數(shù)組元素

記住上面講過的,我們遍歷 $allThreads 數(shù)組,把每個值當(dāng)作 --threads 參數(shù)啟動管線:

  1. for t in ${allThreads[@]}; do
  2.   ./pipeline --threads $t
  3. done

 

遍歷數(shù)組索引

接下來,考慮一個稍稍不同的方法。不遍歷所有的數(shù)組元素,我們可以遍歷所有的索引:

  1. for i in ${!allThreads[@]}; do
  2.   ./pipeline --threads ${allThreads[$i]}
  3. done

一步一步看:如之前所見,${allThreads[@]} 表示數(shù)組中的所有元素。前面加了個感嘆號,變成 ${!allThreads[@]},這會返回數(shù)組索引列表(這里是 0 到 7)。換句話說。for 循環(huán)就遍歷所有的索引 $i 并從 $allThreads 中讀取第 $i 個元素,當(dāng)作 --threads 選項的參數(shù)。

這看上去很辣眼睛,你可能奇怪為什么我要一開始就講這個。這是因為有時候在循環(huán)中需要同時獲得索引和對應(yīng)的值,例如,如果你想要忽視數(shù)組中的***個元素,使用索引可以避免額外創(chuàng)建在循環(huán)中累加的變量。

 

填充數(shù)組

到目前為止,我們已經(jīng)能夠用給定的 --threads 選項啟動管線了。現(xiàn)在假設(shè)按秒計時的運行時間輸出到管線。我們想要捕捉每個迭代的輸出,然后把它保存在另一個數(shù)組中,因此我們最終可以隨心所欲的操作它。

 

一些有用的語法

在深入代碼前,我們要多介紹一些語法。首先,我們要能解析 Bash 命令的輸出。用這個語法可以做到:output=$( ./my_script.sh ),這會把命令的輸出存儲到變量 $output 中。

我們需要的第二個語法是如何把我們剛剛解析的值添加到數(shù)組中。完成這個任務(wù)的語法看起來很熟悉:

  1. myArray+=( "newElement1" "newElement2" )

 

參數(shù)掃描

萬事具備,執(zhí)行參數(shù)掃描的腳步如下:

  1. allThreads=(1 2 4 8 16 32 64 128)
  2. allRuntimes=()
  3. for t in ${allThreads[@]}; do
  4. runtime=$(./pipeline --threads $t)
  5. allRuntimes+=( $runtime )
  6. done

就是這個了!

 

還有什么能做的?

這篇文章中,我們講過使用數(shù)組進行參數(shù)掃描的場景。我敢保證有很多理由要使用 Bash 數(shù)組,這里就有兩個例子:

 

日志警告

本場景中,把應(yīng)用分成幾個模塊,每一個都有它自己的日志文件。我們可以編寫一個 cron 任務(wù)腳本,當(dāng)某個模塊中出現(xiàn)問題標(biāo)志時向特定的人發(fā)送郵件:

  1. # 日志列表,發(fā)生問題時應(yīng)該通知的人
  2. logPaths=("api.log" "auth.log" "jenkins.log" "data.log")
  3. logEmails=("jay@email" "emma@email" "jon@email" "sophia@email")
  4.  
  5. # 在每個日志中查找問題標(biāo)志
  6. for i in ${!logPaths[@]};
  7. do
  8.   log=${logPaths[$i]}
  9.   stakeholder=${logEmails[$i]}
  10.   numErrors=$( tail -n 100 "$log" | grep "ERROR" | wc -l )
  11.  
  12. # 如果近期發(fā)現(xiàn)超過 5 個錯誤,就警告負責(zé)人
  13.   if [[ "$numErrors" -gt 5 ]];
  14.   then
  15.     emailRecipient="$stakeholder"
  16.     emailSubject="WARNING: ${log} showing unusual levels of errors"
  17.     emailBody="${numErrors} errors found in log ${log}"
  18.     echo "$emailBody" | mailx -s "$emailSubject" "$emailRecipient"
  19.   fi
  20. done

 

API 查詢

如果你想要生成一些分析數(shù)據(jù),分析你的 Medium 帖子中用戶評論最多的。由于我們無法直接訪問數(shù)據(jù)庫,SQL 不在我們考慮范圍,但我們可以用 API!

為了避免陷入關(guān)于 API 授權(quán)和令牌的冗長討論,我們將會使用 JSONPlaceholder,這是一個面向公眾的測試服務(wù) API。一旦我們查詢每個帖子,解析出每個評論者的郵箱,我們就可以把這些郵箱添加到我們的結(jié)果數(shù)組里:

  1. endpoint="https://jsonplaceholder.typicode.com/comments"
  2. allEmails=()
  3.  
  4. # 查詢前 10 個帖子
  5. for postId in {1..10};
  6. do
  7. # 執(zhí)行 API 調(diào)用,獲取該帖子評論者的郵箱
  8.   response=$(curl "${endpoint}?postId=${postId}")
  9.  
  10. # 使用 jq JSON 響應(yīng)解析成數(shù)組
  11.   allEmails+=( $( jq '.[].email' <<< "$response" ) )
  12. done

注意這里我是用 jq 工具 從命令行里解析 JSON 數(shù)據(jù)。關(guān)于 jq 的語法超出了本文的范圍,但我強烈建議你了解它。

你可能已經(jīng)想到,使用 Bash 數(shù)組在數(shù)不勝數(shù)的場景中很有幫助,我希望這篇文章中的示例可以給你思維的啟發(fā)。如果你從自己的工作中找到其它的例子想要分享出來,請在帖子下方評論。

 

請等等,還有很多東西!

由于我們在本文講了很多數(shù)組語法,這里是關(guān)于我們講到內(nèi)容的總結(jié),包含一些還沒講到的高級技巧:

< 如顯示不全,請左右滑動 >
語法 效果
arr=() 創(chuàng)建一個空數(shù)組
arr=(1 2 3) 初始化數(shù)組
${arr[2]} 取得第三個元素
${arr[@]} 取得所有元素
${!arr[@]} 取得數(shù)組索引
${#arr[@]} 計算數(shù)組長度
arr[0]=3 覆蓋第 1 個元素
arr+=(4) 添加值
str=$(ls) ls 輸出保存到字符串
arr=( $(ls) ) ls 輸出的文件保存到數(shù)組里
${arr[@]:s:n} 取得從索引 s 開始的 n 個元素

***一點思考

正如我們所見,Bash 數(shù)組的語法很奇怪,但我希望這篇文章讓你相信它們很有用。只要你理解了這些語法,你會發(fā)現(xiàn)以后會經(jīng)常使用 Bash 數(shù)組。

 

Bash 還是 Python?

問題來了:什么時候該用 Bash 數(shù)組而不是其他的腳本語法,比如 Python?

對我而言,完全取決于需求——如果你可以只需要調(diào)用命令行工具就能立馬解決問題,你也可以用 Bash。但有些時候,當(dāng)你的腳本屬于一個更大的 Python 項目時,你也可以用 Python。

比如,我們可以用 Python 來實現(xiàn)參數(shù)掃描,但我們只用編寫一個 Bash 的包裝:

  1. import subprocess
  2.  
  3. all_threads = [1, 2, 4, 8, 16, 32, 64, 128]
  4. all_runtimes = []
  5.  
  6. # 用不同的線程數(shù)字啟動管線
  7. for t in all_threads:
  8.   cmd = './pipeline --threads {}'.format(t)
  9.  
  10. # 使用子線程模塊獲得返回的輸出
  11.   p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
  12.   output = p.communicate()[0]
  13.   all_runtimes.append(output)

由于本例中沒法避免使用命令行,所以可以優(yōu)先使用 Bash。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2019-11-21 15:08:13

DevOps云計算管理

2013-11-11 10:07:43

靜態(tài)路由配置

2017-03-13 17:25:00

移動支付技術(shù)支撐易寶

2017-04-11 09:29:45

WOT

2010-07-27 09:00:32

MySQL鎖

2012-03-13 09:32:15

C#協(xié)變

2011-03-29 15:44:41

對日軟件外包

2019-04-03 09:10:35

Rediskey-value數(shù)據(jù)庫

2016-12-06 08:35:47

瀏覽器內(nèi)核Gecko

2010-08-19 10:12:34

路由器標(biāo)準(zhǔn)

2021-07-12 07:01:39

AST前端abstract sy

2020-09-16 07:59:40

數(shù)組內(nèi)存

2018-04-16 23:14:39

SD-WANSDN網(wǎng)絡(luò)

2010-06-23 16:05:36

Linux Bash

2015-06-05 09:52:41

公有云風(fēng)險成本

2014-05-06 10:31:21

KillallLinux命令行

2021-01-14 08:31:54

Web開發(fā)應(yīng)用程序

2012-02-21 09:20:50

Hadoop大數(shù)據(jù)

2020-12-10 08:13:15

ARM架構(gòu) 嵌入式

2022-11-30 07:47:00

Bash腳本
點贊
收藏

51CTO技術(shù)棧公眾號