shell(函數和數組)

目錄

一、函數

1.函數的由來

2.函數的作用

3.函數的使用方法

4.函數的定義

5.查看函數

6.刪除函數

7.函數返回值

8.函數的傳參數

9.函數遞歸

二、數組

1.數組的相關介紹

2.聲明數組

3.定義數組的格式

4.冒泡排序

總結:本章主要介紹了函數和數組相關知識


一、函數

1.函數的由來

在編寫腳本時,有些腳本可以反復使用,可以調用函數來解決,腳本定義成函數類似于別名

2.函數的作用

函數的作用:避免腳本重復性,增加可讀性,方便使用

3.函數的使用方法

先定義函數再引用函數

1.直接寫 函數中調用函數 直接寫函數名

2.同名函數 后一個生效

3.調用函數一定要先定義

4.每個函數是獨立

4.函數的定義

基本格式

1.

function 函數名 {

命令序列

}

2.

函數名 () {

命令序列

}

3.

function 函數名 {

命令序列

}

例子:

5.查看函數

declare -F? ?查看函數列表

declare -f? ? 查看函數的具體定義

6.刪除函數

unset 函數名

7.函數返回值

return(自定義返回值)范圍(0-255)超出時除以256取余

return表示退出函數并返回一個退出值,腳本中可以用$?變量表示該值

使用原則:

  1. 函數一結束就去返回值,應為$?變量只返回執行的最后一條命令的退出返回碼

  2. 退出碼必須是0-255,超出的值將為除以256取余

[root@localhost opt]# vim f.sh
[root@localhost opt]# bash f.sh
輸入數字:8
16
#!/bin/bash
fc1 (){
read -p "輸入數字:" s
return $[$s*2]
}
fc1
echo $?

8.函數的傳參數

函數的$1和$2是指跟在函數后面的值

腳本中的$1,$2和函數的$1,$2是沒有關系的

[root@localhost data]# vim r.sh
[root@localhost data]# bash r.sh 2 3
2
3

#!/bin/bash
sum1 (){
echo $1
echo $2
}
sum1 $1 $2

函數變量的作用范圍

local命令:只在內部有效對外部無效(局部變量)只對函數有效

name命令:普通變量

export命令:讓子shell繼承變量

如果加local關鍵字可以讓變量只在函數中生效,不會影響外界函數的返回值

9.函數遞歸

函數調用自己本身的函數(階乘)

例:

5!=5*4*3*2*1=120

4!=4*3*2*1=24

#/bin/bash
fact () {if [ $1 -eq 1 ]thenecho "1"elser=$[$1*`fact $[$1-1]`]echo $rfi
}
fact $1

vim jc.sh
[root@localhost data]# bash jc.sh 3
6
[root@localhost data]# bash jc.sh 4
24

二、數組

1.數組的相關介紹

數組分為普通數組和關聯數組

普通數組下標為數字

關聯數組下標為有含義的字符串

變量:存儲單個元素的內存空間

數組:存儲多個元素的連續的內存空間,相當于多個變量的集合

數組名和索引

索引的編號從0開始,屬于數值索引

索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引

bash的數組支持稀疏格式(索引不連續)

2.聲明數組

使用數組需要先聲明數組

普通數組:? ? ? ? ? ? ? ? ? ? ? ? ? declare -a [數組名]

普通數組不需要手動聲明,系統自動幫你聲明

關聯數組:? ? ? ? ? ? ? ? ? ? ? ? ? declare -A [數組名]

關聯數組一定要聲明

3.定義數組的格式

定義數組格式:

1.數組名=(value0 value1 value2 value3 ......)

2.數組名=([0]=value [1]=value1 [2]=value2 ....)

3.列表名="value0 value1 value2 value3 ...... "

4.數組名=($列表名)

數組名[0]="value1"

數組名[1]="value2"

數組名[2]="value3"

數組的包括數據類型

數值型

字符型

混合型數值加字符

使用" "或' '定義單引號或雙引號括起來

[root@localhost ~]# a=(10 20 30 40 50)
[root@localhost ~]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
[root@localhost ~]# echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]# echo ${a[0]}
10
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${#a[@]}
5
[root@localhost ~]# echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#?

a=(10 20 30 40 50) 定義數組

declare -a? 查看數組

?echo ${!a[*]}? 查看下標

echo ${a[0]}? 查看數組中個體

echo ${!a[*]}? 查看所有下標

echo ${a[@]}? 查看數組中的所有個體

echo ${#a[@]}? ?查看數組的長度(個數)

echo ${!a[@]}? ?查看所有下標

*和@同義

數組分隔

echo ${a[@]:0:5}

[root@localhost ~]# echo ${a[@]:0:5}
10 20 30 40 50
[root@localhost ~]# echo ${a[@]:2:5}
30 40 50
[root@localhost ~]# echo ${a[@]:2:2}
30 40
[root@localhost ~]# echo ${a[@]:2:3}
30 40 50
[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#?

echo ${a[@]:0:5}? 代表跳過前0個提取后5個

echo ${a[@]:2:2} 代表跳過前2個提取后2個

echo ${a[@]}? 代表數組所有個體

[root@localhost ~]# echo ${a[@]}
10 20 30 40 50
[root@localhost ~]# echo ${a[1]}
20
[root@localhost ~]# a[1]=9
[root@localhost ~]# echo ${a[1]}
9
[root@localhost ~]# echo ${a[@]}
10 9 30 40 50
[root@localhost ~]#?

a[1]=9 數組替換把原來的20換成了9

4.冒泡排序

冒泡 ? 是通過數字比較 將大的數往后排 ?小的數往前面排
5個數字 5-1=4 ?需要比較4輪 ?才能知道每一個數字的具體位置
a=(10?50 89?46?38)?
輪次 ?總個數 ? 需要比較的數 ?比幾次 ? ? 找到的數
第1輪 ?5 ? ? ?5個數 ? ? ? ?比4次 ? ? 找到最大數 ? ?
第2輪 ?5 ? ? ?4個數 ? ? ? ?比3次 ? ? 找到第二大數 ?
第3輪 ?5 ? ? ?3個數 ? ? ? ?比2次 ? ? 找到第三大的數
第4輪 ?5 ? ? ?2個數 ? ? ? ?比1次 ? ? 找到第四大的數

#!/bin/bash
a=(10 50 89 46 38)
for ((i=1;i<5;i++))
dofor ((j=0;j<5-$i;j++))dof=${a[$j]}m=$[$j+1]s=${a[$m]}if [ $f -gt $s ]thenq=$fa[$j]=$sa[$m]=$qfidone
done
echo "排序后的數組為${a[@]}"

[root@localhost data]# vim mpd.sh
[root@localhost data]# bash mpd.sh
排序后的數組為10 38 46 50 89
[root@localhost data]#?

總結:本章主要介紹了函數和數組相關知識

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164494.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運維 在Windows上搭建小型Git服務

文章目錄 1、Git選型1.1、主要特性1.2、代碼管理1.3、工單管理1.4、Pull/Merge requests1.5、第三方集成1.6、選型結論 2、環境搭建2.1、Gitea下載2.2、Gitea安裝2.3、配置服務信息2.4、運行服務2.5、注冊Gitea為服務2.6、正常使用 1、Git選型 1.1、主要特性 1.2、代碼管理 1.…

多數據庫使用django-apscheduler時,migrate后并不能生成django_apscheduler_djangojob表的問題

先說一下django-apscheduler定時器的使用過程&#xff1a; django-apscheduler基本使用 1.安裝django-apscheduler代碼如下&#xff08;示例&#xff09;&#xff1a; pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代碼如下&#xff08;示例&#xff09…

項目中常用的 19 條 SQL 優化寶典

一、EXPLAIN 做MySQL優化,我們要善用 EXPLAIN 查看SQL執行計劃。 下面來個簡單的示例,標注(1,2,3,4,5)我們要重點關注的數據 type列,連接類型。一個好的sql語句至少要達到range級別。杜絕出現all級別 key列,使用到的索引名。如果沒有選擇索引,值是NULL。可以采取強制索引…

【CCF-PTA】第03屆Scratch第01題 -- 夢醒時分

夢醒時分 【題目描述】 睡眠是人體正常的生理需要&#xff0c;同年齡男女睡眠時間無明顯差別&#xff0c;一般是8小時左右。居家的小明作息生活很規律&#xff0c;晚上11點睡覺&#xff0c;早晨7點起床學習。請你編寫程序來判斷&#xff0c;每周&#xff08;共168小時&#x…

【JavaEE初階】 JavaScript相應的WebAPI

文章目錄 &#x1f332;WebAPI 背景知識&#x1f6a9;什么是 WebAPI&#x1f6a9;什么是 API &#x1f38d;DOM 基本概念&#x1f6a9;什么是 DOM&#x1f6a9;DOM 樹 &#x1f340;獲取元素&#x1f6a9;querySelector&#x1f6a9;querySelectorAll &#x1f384;事件初識&am…

不是吧?線程池這樣搞?

其他系列文章目錄 設計模式合集 多線程合集 分布式合集 ES合集 文章目錄 系列文章目錄 前言 一、為什么需要線程池&#xff1f; 二、舉個背景例子 三、怎么創建線程池&#xff1f; 四、線程池指定線程數 前言 學習線程池能夠幫助我們更好地處理多線程編程&#xff0c;并提高程…

TikTok美區本土店鋪如何做好IP隔離?

為什么要進行IP隔離呢&#xff1f;因為我們無法在國內直接運營Shopee、TikTok、Lazada等平臺的本土店&#xff0c;平臺識別出店鋪登錄IP非本土IP&#xff0c;則容易導致店鋪風控、被標記為偽本土店&#xff0c;影響店鋪經營。 TikTok美區店鋪的IP隔離方法和Shopee本土店一致&a…

SpringMVC(二)

八、HttpMessageConverter HttpMessageConverter&#xff0c;報文信息轉換器&#xff0c;將請求報文轉換為Java對象&#xff0c;或將Java對象轉換為響應報文 HttpMessageConverter提供了兩個注解和兩個類型&#xff1a;RequestBody&#xff0c;ResponseBody&#xff0c;Reque…

【MySQL】子查詢

文章目錄 子查詢IN運算符子查詢 VS 連接ALL關鍵字ANY關鍵字相關子查詢 !EXISTS運算符select子句中的子查詢from子句中的子查詢 子查詢 獲取價格大于id為3的貨物的商品 用到了內查詢&#xff0c;獲取id為3的商品的單價&#xff0c;把結構傳給外查詢 在where子句中編寫子查詢&am…

【python基礎(四)】if語句詳解

文章目錄 一. 一個簡單示例二. 條件測試1. 檢查多個條件1.1. 使用and關聯多個條件1.2. 使用or檢查多個條件1.3. in的判斷 2. 布爾表達式 三. if語句1. 簡單的if語句2. if-else語句3. if-elif-else結構4. 使用多個elif代碼塊5. 省略else代碼塊 四. 使用if語句處理列表1. 檢查特殊…

2023-11-23 LeetCode每日一題(HTML 實體解析器)

2023-11-23每日一題 一、題目編號 1410. HTML 實體解析器二、題目鏈接 點擊跳轉到題目位置 三、題目描述 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們…

Endnote軟件添加期刊引用格式

在下述網址中&#xff0c;找到你想要添加的期刊&#xff0c;下載引用格式文件&#xff08;后綴為.ens格式&#xff09; https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下載…

SQLY優化

insert優化 1.批量插入 手動事務提交 主鍵順序插入&#xff0c;主鍵順序插入性能高于亂序插入 2.大批量插入數據 如果一次性需要插入大批量數據&#xff0c;使用Insert語句插入性能較低&#xff0c;此時可以使用MYSQL數據庫提供的load指令進行插入 主鍵優化 主鍵設計原則 …

Java實現王者榮耀小游戲

主要功能 鍵盤W,A,S,D鍵&#xff1a;控制玩家上下左右移動。按鈕一&#xff1a;控制英雄發射一個矩形攻擊紅方小兵。按鈕控制英雄發射魅惑技能&#xff0c;傷害小兵并讓小兵停止移動。技能三&#xff1a;攻擊多個敵人并讓小兵停止移動。普攻&#xff1a;對小兵造成基礎傷害。小…

vue3 終端實現 (vue3+xterm+websocket)

目錄 一、xterm介紹 二、效果展示 三、vue文件實現代碼 一、xterm介紹 xterm是一個使用

【C++初階】STL詳解(七)Stack與Queue的模擬實現

本專欄內容為&#xff1a;C學習專欄&#xff0c;分為初階和進階兩部分。 通過本專欄的深入學習&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn個人主頁&#xff1a;小小unicorn ?專欄分類&#xff1a;C &#x1f69a;代碼倉庫&#xff1a;小小unicorn的代碼倉庫&…

力扣labuladong一刷day17天前綴和數組

力扣labuladong一刷day17天前綴和數組 一、303. 區域和檢索 - 數組不可變 題目鏈接&#xff1a;https://leetcode.cn/problems/range-sum-query-immutable/ 思路&#xff1a;本題即為讓寫一個類用于計算指定區間內的數字和&#xff0c;但如果直接采用for循環的方式&#xff0…

Unity調用dll踩坑記

請用寫一段代碼&#xff0c;讓unity無聲無息的崩潰。 你說這怕是有點難哦&#xff0c;誰會這么不幸呢&#xff1f;不幸的是&#xff0c;我幸運的成為了那個不幸的人。 unity里面調用dll的方式是使用 DllImport &#xff0c;比如有一個 Hello.dll&#xff0c;里面有一個 char* …

圖片如何去除水印?試試這三種去水印方法!

從事自媒體行業的小伙伴們&#xff0c;你們是否經常為文章配圖而煩惱呢&#xff1f;下載的圖片大部分帶有各種各樣的水印或者多余元素&#xff0c;讓人感到困擾。今天&#xff0c;我要分享三個去水印的妙招&#xff0c;這是新媒體人必備的圖片處理技能&#xff0c;快來一起學起…

【MATLAB源碼-第87期】基于matlab的Q-learning算法柵格地圖路徑規劃,自主選擇起始點和障礙物。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 Q-learning是一種無模型的強化學習算法&#xff0c;適用于有限的馬爾可夫決策過程&#xff08;MDP&#xff09;。它的核心是學習一個動作價值函數&#xff08;action-value function&#xff09;&#xff0c;即Q函數&#xf…