Linux_Bash_Shell_索引數組和關聯數組及稀疏數組

来源:https://www.cnblogs.com/mtyxb/archive/2022/10/09/16771367.html
-Advertisement-
Play Games

1. 索引數組 一、什麼是索引數組? 所謂索引數組就是普通數組,以整數作為數組元素的索引下標。 二、實例。 備註: (a)使用-a選項定義索引數組,使用一對小括弧()定義數組中的元素列表。 (b)索引數組使用整數作為數組元素下標。 備註: (a)使用@和*作為數組下標,表示獲取所有元素。 三、實例。 ...


 

1. 索引數組

 

一、什麼是索引數組?

所謂索引數組就是普通數組,以整數作為數組元素的索引下標。

 

 

 

二、實例。

 

 

備註:

(a)使用-a選項定義索引數組,使用一對小括弧()定義數組中的元素列表。

(b)索引數組使用整數作為數組元素下標。

 

 

備註:

(a)使用@*作為數組下標,表示獲取所有元素。

 

三、實例。

 

備註:

(a)${#a[@]}${#a[*]}都表示計算數組長度,也就是元素的數量。

 

四、實例。

 

備註:

(a)直接使用數組下標索引來修改數組中指定的元素。

 

五、實例。

 

 

 

 

備註:

(a)數組使用感嘆號獲取數組中所有已存在的元素的索引下標。

 

 

下載Linux Bash Shell免費教程PDF文件:

點擊此處下載  補天雲C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip

2. 關聯數組

一、什麼是關聯數組?

所謂關聯素組指的是使用普通字元串作為數組下標,每一個元素形成一個鍵值對,也就是key-value

 

二、實例。

 

 

備註:

(a)使用大寫的-A選項配合小括弧()定義關聯數組。

(b)這個例子中使用字元串a作為鍵值對的keyButianyun作為鍵值對的value,以此類推。

(c)關聯數組也可以正常使用感嘆號獲取所有的索引下標,正常使用#這個符號獲取數組的長度。

 

 

下載Linux Bash Shell免費教程PDF文件:

點擊此處下載  補天雲C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip

3. 稀疏數組

 

一、什麼是稀疏數組?

所謂稀疏數組是指整數作為數組索引下標時,所有的索引下標按照從小到大排序之後在數值上並不連續的數組,因為有一些索引下標對應的元素並不存在。

 

二、實例。

 

 

 

備註:

(a)這個例子中先定義了一個空的索引數組,然後直接對某一些索引序號對應的元素賦值,自然而然的創建了一個稀疏數組。

(b)索引數組中元素的排列次序是按照索引下標的整數從小到大排序的。

 

三、實例。

 

 

 

備註:

(a)索引數組也是支持直接在小括弧內使用中括弧指定每一個元素的索引下標。

 

 

四、實例。

 

 

 

備註:

(a)思考:

問題:這個數組a是索引數組還是關聯數組?

答案:索引數組。原因:使用-a選項只能定義索引數組。

(b)如果在後面指定的索引下標跟前面的重覆了,那麼後面的索引下標對應的元素會覆蓋掉前面的元素。效果上相當於前面的元素沒有出現一樣。

 

 

下載Linux Bash Shell免費教程PDF文件:

點擊此處下載  補天雲C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip

 

4. 關聯數組的元素排列次序

一、實例。

 

 

 

備註:

(a)思考:

問題:這個數組a是稀疏數組嗎?

答案:不是。原因:使用大寫的-A選項定義的是關聯數組。

 

(b)如果使用關聯數組,可以看到運行結果與索引數組完全不同。

(c)關聯數組中的元素的排列既沒有按照索引下標排序,不是按整數排序,也不是按字元串排序;也不是按照定義數組時元素出現的次序排序。排列次序看起來似乎是雜亂無章的。

 

 

二、實例。

 

 

 

 

備註:

(a)可以看到既不是按照鍵值對的key排序,也沒有按照鍵值對的value排序。

(b)思考:

問題:為什麼關聯數組的元素排列出現這種看起來雜亂無章的排列次序?

答案:關聯數組內部使用哈希技術。根據哈希的特性,key的次序無法決定key的哈希值的次序。

 

三、實例。

 

 

 

備註:

(a)對於這種只有一個字母作為key的關聯數組,元素的排列次序看起來好像是有規律的,實際上卻是是有規律的。

(b)下麵使用隨機化產生的關聯數組來解釋這種規律。

butianyun.sh腳本文件:

 

 

 

備註:

(a)總結:對於這種索引下標只有一個字母或數字的關聯數組,元素排列次序有規律:

規律1:字母作為索引的,按照索引下標的ASCII碼次序從大到小排列,也就是正常ASCII碼次序的逆序排列。

規律2:數字作為索引的,按照索引下標的ASCII次序從大到小排列。

規律3:數字作為索引的元素排在字母作為索引的元素的前面。

(b)對於這種情況,元素排列次序並不能說成是按照ASCII次序從大到小排列,而是先把數字和字母分成了兩大類。

 

 

備註:

(a)如果key不是一個字元,而是兩個字元或更多字元,則沒有這種規律了。

(b)下麵這個例子更好的證明瞭這一點。

butianyun.sh腳本文件:

 

 

 

 

 

備註:

(a)隨機化產生的關聯數組,索引下標是兩個字母或數字,這時元素的排列次序就沒有規律,而是取決於key的哈希值。

 

下載Linux Bash Shell免費教程PDF文件:

點擊此處下載  補天雲C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip

 

5. @*的異同點

一、實例。

 

 

 

備註:

(a)數組a總共有三個元素,第二個元素包含一個空格。

(b)在這個例子中,使用@*並沒有什麼區別。

(c)不管使用@還是*,數組a的長度都是3

 

 

 

 

備註:

(a)在這個例子中,使用@*也沒有什麼區別。

(b)思考:

問題:為什麼在把數組a的元素全部放置到數組bc中之後,bc的數組長度都是4呢?

答案:代碼中對bc的賦值,等效於如下代碼。

 

 

 

備註:

(a)bash shell對命令行的參數的解析過程中,有一個去掉雙引號的過程,相當於這些字元串都沒有加雙引號。所以就會被認為有四個元素。

 

二、實例。

 

 

 

 

備註:

(a)在對數組bc賦值時,小括弧()中加了雙引號,使用@*的效果就有了很大的區別。

(b)思考:

問題:為什麼使用@之後數組b3個元素,而使用*之後數組c只有1個元素?

答案:這跟bash shell${a[@]}${a[*]}的規定有關。

 

bash shell中,把${a[@]}展開之後相當於將數組a的每一個元素加上雙引號之後形成一個列表。

 

 

 

備註:

(a)這個例子解釋了為什麼數組b有三個元素。Linux Bash這個字元串在a中作為一個元素,在b中還是作為一個元素看待。

bash shell中,把${a[*]}展開之後相當於將數組a的每一個元素形成一個列表之後再整體上加雙引號,這樣自然就只有一個元素了。

 

 

 

備註:

(a)這個例子解釋了為什麼數組c只有一個元素。Butianyun Linux Bash Shell這個字元串整體在c中作為一個元素看待。

 

 

三、實例。

理解@*的區別有什麼價值呢?下麵討論在for迴圈中的應用。

 

 

 

 

備註:

(a)數組a本身只有三個元素。第二個元素包含空格。

(b)在不加雙引號時,不管使用@還是*,迴圈體都是執行四次。

(c)數組a的第二個元素Linux Bash被拆分成兩個獨立的詞語。

 

 

 

 

備註:

(a)在使用@並且加了雙引號之後,迴圈體只執行了三次。數組a的第二個元素並沒有被拆分。

加雙引號之後,相當於數組a的每一個元素加上雙引號之後形成了一個列表。

 

 

 

 

備註:

(a)在使用*並且加了雙引號之後,迴圈體只執行了一次。數組a的所有元素形成一個列表之後再加雙引號,相當於數組a的所有元素合併成了一個整體。

 

下載Linux Bash Shell免費教程PDF文件:

點擊此處下載  補天雲C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip

 

 

 

C語言研發工程師 C++軟體工程師 QT開發工程師 界面美化 控制項美化 C/C++/QT/QT5精講系列視頻課程

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

-Advertisement-
Play Games
更多相關文章
  • 作為軟體工程經理,我也會遇到人情世故的難題。最近一位團隊成員提出了離職申請,是因為個人的原因,而且很直接。 1、收到離職申請 我知道他會離職,我很少有措手不及的時候,所以我早就有預感,事實證明我的預感沒錯。幾周前,我就有一種感覺:“該來的遲早會來。”他們提出的問題、他們的疑慮以及他們有時會莫名離開辦 ...
  • 1.使用map()進行函數映射 ✅ Exp1:將字元串數組中的小寫字母轉為大寫字母。 測試數組為 oldlist = ['life', 'is', 'short', 'i', 'choose', 'python']。 方法一 newlist = [] for word in oldlist: new ...
  • 1.需要保證電腦中安裝了protobuf安裝教程 2.如果出現報錯請看博客protobuf報錯問題解決 3.demo地址:demo 簡介: rpc微服務,grpc是一種開源的高性能RPC框架,能夠運行在任何環境中,最初由谷歌進行開發,它使用HTTP2作為傳輸協議。grpc讓客戶端可以像調用本地方法一 ...
  • 使用EF Core的Code First,在設計階段,直接使用Database.EnsureCreated()和EnsureDeleted()可以快速刪除、更新最新的數據結構。由於沒有什麼數據,刪除的風險非常低。但是對於已經投入生產的資料庫,這個方法就絕對不可行了。 考慮以下場景: 項目已經上線,一 ...
  • 一、大家是否有這個需求 1.跨品種查詢 :比如 MYSQL和一個SQLSERVER進行聯表查詢 ,或者SQLITE和MYSQL進行聯表查詢 2.跨伺服器查詢 : A伺服器和B伺服器查詢 如果想同時支持1和2 相信很多人都沒有比較好的解決方案 我的設計是通過多庫架構來實現多庫操作 二、 多庫架構ORM ...
  • 一、概念 委托的本質也是一種類型,類似於Class這樣。作用是將一個方法作為參數傳遞給另一個方法,關鍵字是delegate 二、委托的定義使用步驟 第一步聲明委托: public delegate int myDelegate(int a, int b); 1、聲明一個委托類型,可以用訪問修飾符修飾 ...
  • keepalived高可用(haporxy) keepalived高可用的介紹可以參考keepalived高可用(nginx) 環境 |系統信息| 主機名 |IP |服務| | : | : | : | : | |centos8| master| 192.168.222.250| haproxy,ke ...
  • keepalived實現haporxy負載均衡機高可用 環境說明 | 系統信息 | 主機名 | IP | 服務 | | | | | | | centos8 | master | 192.168.111.141 | haproxykeepalived | | centos8 | backup | 19 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...