Bash腳本編程之數組

来源:https://www.cnblogs.com/alongdidi/archive/2019/12/04/bash_array.html
-Advertisement-
Play Games

數組簡介 在bash腳本編程當中,變數是存儲單個元素的記憶體空間;而數組是存儲多個元素的一段連續的記憶體空間。 數組由數組名和下標構成,如下。 ARRAY_NAME[SUBSCRIPT] 數組按照下標的類型可分為兩種: 索引(indexed)數組:下標為0、1、2等非負整數。 關聯(associativ ...


數組簡介

在bash腳本編程當中,變數是存儲單個元素的記憶體空間;而數組是存儲多個元素的一段連續的記憶體空間。

數組由數組名和下標構成,如下。

ARRAY_NAME[SUBSCRIPT]

數組按照下標的類型可分為兩種:

  • 索引(indexed)數組:下標為0、1、2等非負整數。
  • 關聯(associative)數組:下標為用戶自定義的字元串。

 

數組的操作

聲明

索引數組可以不聲明直接使用;而關聯數組如果不聲明直接使用的話,會被認為是索引數組,即使它的下標是字元串。

索引數組的聲明方式。

# declare -a ARRAY_NAME

關聯數組的聲明方式。

# declare -A ARRAY_NAME

賦值

一次只賦值一個元素。

# ARRAY_NAME[SUBSCRIPT]=VALUE

一次賦值全部元素。

# ARRAY_NAME = ("VAL1" "VAL2" "VAL3" ...)

一次賦值多個可以是不連續的元素。

# ARRAY_NAME = ([0] = "VAL1" [3] = "VAL3")

像這種不要求元素必須依次存在的數組(即可以在沒有A[1]和A[2]的時候就賦值A[3]),叫做稀疏格式數組。因此,bash支持稀疏格式的數組。

讀取標準輸入賦值數組。

# read -a ARRAY_NAME

在輸入的時候,以空格作為元素的分隔符,以回車鍵結束元素的賦值。

向數組的末尾追加元素。

ARRAY_NAME[${#ARRAY_NAME[@]}]=VALUE 

或者

ARRAY_NAME+=(VALUE)

引用

引用單個數組元素。

${ARRAY_NAME[SUBSCRIPT]}

如果省略SUBSCRIPT,那麼就等同於SUBSCRIPT=0。即以下兩個引用是相同的。

${ARRAY_NAME[0]}
${ARRAY_NAME}

引用數組的所有元素。正常情況下,二者沒有區別,只有當被雙引號包裹的時候,“@”被展開為每個元素為一個獨立的單詞;“*”被展開為所有元素為一個統一的單詞。

${ARRAY_NAME[@]}
${ARRAY_NAME[*]}

引用數組元素的長度。

${#ARRAY_NAME[SUBSCRIPT]}

引用數組的長度,即數組的元素個數。

${#ARRAY_NAME[@]}
${#ARRAY_NAME[*]}

引用數組的部分元素(切片)。

${ARRAY_NAME[@]:OFFSET:NUMBER}
${ARRAY_NAME[*]:OFFSET:NUMBER}

OFFSET:偏移,表示偏移/跳過數組中的前幾個元素。

NUMBER:表示偏移後取幾個元素。

如果省略了NUMBER,並且OFFSET的值為“ -n”(註意,-n的左邊有空格),則表示引用倒數的幾個元素。

截止目前我們引用的都是數組的值,如果我們想引用數組的下標的話,可以使用:

${!ARRAY_NAME[@]}
${!ARRAY_NAME[*]}

刪除

刪除數組元素。

# unset ARRAY_NAME[SUBSCRIPT]

刪除數組。

# unset ARRAY_NAME

 

數組示例

定義一個索引數組,逐一賦值數組元素。

[root@c7-server ~]# declare -a my_array
[root@c7-server ~]# my_array[0]=zhang
[root@c7-server ~]# my_array[1]=wen
[root@c7-server ~]# my_array[2]=long

根據數組下標獲取數組元素。留意我們上文說的,當引用數組不帶下標的時候,等同於引用${ARRAY_NAME[0]}。

[root@c7-server ~]# echo ${my_array}
zhang
[root@c7-server ~]# echo ${my_array[0]}
zhang
[root@c7-server ~]# echo ${my_array[1]}
wen
[root@c7-server ~]# echo ${my_array[2]}

引用數組中的所有元素,順便測試一下“@”和“*”的區別。註意,這個區別,僅在${my_array[@]}或者${my_array[*]}被雙引號包裹的情況下才會出現。

[root@c7-server ~]# echo ${my_array[@]}
zhang wen long
[root@c7-server ~]# echo ${my_array[*]}
zhang wen long
[root@c7-server ~]# for i in "${my_array[@]}"; do echo $i; done
zhang
wen
long
[root@c7-server ~]# for i in "${my_array[*]}"; do echo $i; done
zhang wen long

引用數組個數。

[root@c7-server ~]# echo ${#my_array[@]}
3
[root@c7-server ~]# echo ${#my_array[*]}
3

引用數組中元素的個數。

[root@c7-server ~]# echo ${my_array[0]}
zhang
[root@c7-server ~]# echo ${#my_array[0]}
5

接下來演示其他幾種不同的賦值方式,操作前可先刪除數組。

[root@c7-server ~]# unset my_array
[root@c7-server ~]# my_array=([0]=zhang [1]=wen [2]=long)
[root@c7-server ~]# echo ${my_array[@]}
zhang wen long
[root@c7-server ~]# unset my_array
[root@c7-server ~]# read -a my_array
Mon Tue Wed Thu Fri Sat Sun
[root@c7-server ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun

數組元素去子串(substring),即切片。

[root@c7-server ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun
[root@c7-server ~]# echo ${my_array[@]:3:2}
Thu Fri
[root@c7-server ~]# echo ${my_array[@]:2:3}
Wed Thu Fri
[root@c7-server ~]# echo ${my_array[@]: -3}
Fri Sat Sun

數組元素追加。

[root@c7-server ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun
[root@c7-server ~]# my_array+=(ddd)
[root@c7-server ~]# my_array[${#my_array[@]}]=eee
[root@c7-server ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun ddd eee

引用數組的下標(subscript)。個人感覺引用數組下標在關聯數組中比較有用,在索引數組中用處不大。

[root@c7-server ~]# echo ${!my_array[@]}
0 1 2 3 4 5 6 7 8
[root@c7-server ~]# unset my_array
[root@c7-server ~]# declare -A my_array
[root@c7-server ~]# my_array=([name]=zwl [age]=28 [sex]=male)
[root@c7-server ~]# echo ${my_array[@]}
zwl 28 male
[root@c7-server ~]# echo ${!my_array[@]}
name age sex

 

練習題

題一:生成10個隨機數並輸出,然後輸出其中的最大值和最小值。

 

題二:生成10個隨機數並輸出,然後將其由小到大進行排序。

 

題三:定義一個數組,數組元素為/var/log/目錄下所有以.log結尾的文件的文件名;統計下標為偶數的文件的行數並求和。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言: 業務人員繪製流程時,通常使用圖形GUI界面交互操作來完成,然而對於需要頻繁操作或者管理較多流程的系統管理用戶,就需要一款輔助工具,來幫助他們快速完成流程的創建和編輯更新。Slickflow.Graph 圖形編碼建模工具通過命令行直接編寫代碼創建圖形,實現了流程圖形繪製效率的快速提升。 申明: ...
  • [HttpPost] public void Import() { //獲取文件 HttpPostedFileBase fileBase = Request.Files["file"]; if(fileBase==null) { Response.Write(""); } //轉數據流 Stream ...
  • Aspose.Words For .Net是一種高級Word文檔處理API,用於執行各種文檔管理和操作任務。API支持生成,修改,轉換,呈現和列印文檔,而無需在跨平臺應用程式中直接使用Microsoft Word。此外,API支持所有流行的Word處理文件格式,並允許將Word文檔導出或轉換為固定布 ...
  • Linux 命令之 cp 命令詳解 一、cp 命令簡介 cp 命令主要用於複製文件或目錄。即用來將一個或多個源文件或者目錄複製到指定的目的文件或目錄。 cp 命令可以將單個源文件複製成一個指定文件名的具體的文件或一個已經存在的目錄下。 cp 命令支持同時複製多個文件,當一次複製多個文件時,目標文件參 ...
  • 簡介: 搭建個人雲存儲一般會想到ownCloud,堪稱是自建雲存儲服務的經典。而Nextcloud是ownCloud原開發團隊打造的號稱是“下一代”存儲. 真正試用過後就由衷地贊同這個Nextcloud:它是個人雲存儲服務的絕佳選擇。一開始以為Nextcloud只是一個網盤雲存儲,後來看到 Next ...
  • 上期問題回顧 上期問題回顧 上期問題回顧 上期問題回顧 上期問題回顧 全球 IPv4 地址正式耗盡,IPv4地址大約42.9億,按照理論來說,每一個聯網的設備都需要IP地址,而現在全球聯網設備遠遠不止42.9億,那麼,這麼多設備是怎麼處理聯網的問題呢? 先說說IPv4的格式 0~255.0~255. ...
  • https://www.jianshu.com/p/2237f029c385 https://www.cnblogs.com/chenpython123/p/11052276.html https://blog.csdn.net/weixin_33907511/article/details/857 ...
  • i.MXRTxxx支持存儲類型一共有三種:一是256KB的ROM(即BootROM)、二是總容量4.5MB的RAM(有兩個映射起始地址0x00000000/0x20000000)、三是分配給外部存儲器介面控制器(QSPI)的128MB區域。i.MXRTxxx Boot方式主要是藉助BootROM從外... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...