shell 腳本的函數和數組

函數

—— 封裝的一個公式:sin、cos、tan

—— 函數為腳本的別名

—— 函數就是一個功能模塊,在函數中寫執行的命令即可;使用函數可以避免代碼重復,增加可讀性,簡化腳本,使用函數可以將大的工程分割為若干小的功能模塊,代碼的可讀性更強

—— 函數由函數名和函數體組成

—— 函數一定要先定義,才能使用

—— 幫助:help function

函數的用法

注:一定要先給函數定義,才能執行函數

查看函數
declare 命令

—— declare -F :查看函數列表

—— declare -f __函數名 :查找指定函數名;兩個下劃線

函數的定義

—— 格式1:自定義函數名 () {

腳本;命令序列

}

—— 格式2:function 自定義函數名 {

腳本;命令序列

}

—— 格式3:function 自定義函數名 (){

腳本;命令序列

}

例
格式1    #一般用此格式
[root@localhost opt]# han () { echo "hello"; }
#定義一個函數 han 為標準輸出 hello
[root@localhost opt]# han
hello    #執行此函數,顯示結果格式2
[root@localhost opt]# function han { echo "hello"; }
[root@localhost opt]# han
hello格式3
[root@localhost opt]# function han () { echo "hello"; }
[root@localhost opt]# han
hello

刪除函數
unset 命令

—— unset 函數名

例
#先定義一個函數,并驗證是否能使用
[root@localhost opt]# han () { echo "hello"; }
[root@localhost opt]# han
hello[root@localhost opt]# unset han      #刪除函數
[root@localhost opt]# han
bash: han: 未找到命令...
#再次使用函數,驗證是否刪除;刪除成功

定義函數變量的作用范圍

local

—— 加此關鍵詞,可以固定函數的變量范圍,使其只能在函數內運行

export

—— 讓子shell 繼承變量


例
[root@localhost opt]# name=吳彥祖       #定義一個變量name為吳彥祖
[root@localhost opt]# echo $name       #驗證
吳彥祖
[root@localhost opt]# id () { name=彭于晏;echo $name; }
#定義一個函數id,讓其中變量name輸出結果為彭于晏
[root@localhost opt]# id               #驗證
彭于晏
[root@localhost opt]# echo $name
彭于晏#此時輸出變量name已經被函數id所影響
[root@localhost opt]# unset id
[root@localhost opt]# echo $name
彭于晏
#就算刪除函數id,變量name已經被更改
[root@localhost opt]# name=吳彥祖        #重新定義name
[root@localhost opt]# echo $name        #驗證
吳彥祖
[root@localhost opt]# id () { local name=彭于晏;echo $name; }
#使用命令 local,限制變量參數,使其只能在函數中執行
[root@localhost opt]# id                #驗證
彭于晏
[root@localhost opt]# echo $name        #驗證,此時變量name不會被函數id影響
吳彥祖

函數的返回值

return

—— 自定義 返回值 0 -- 255

—— 如果使用函數,那么 $? 那么使用就會受限,可以使用 return 自定義 $? 的返回值,來判斷函數中的命令是否成功

—— 函數一結束就取返回值,因為 $? 變量只返回執行的最后一條命令的退出返回碼

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

例
[root@localhost opt]# text () { echo "hello"; }
#定義一個函數
[root@localhost opt]# text
hello
[root@localhost opt]# echo $?
0
#此時返回值為0
[root@localhost opt]# text () { echo "hello";return 250; }
#更改返回值為250
[root@localhost opt]# text
hello
[root@localhost opt]# echo $?
250
#此時返回值已經被更改為250

函數的傳遞參

腳本
#!/bin/bash
sum () {
echo " $1 "     #識別第一個字符串
echo " $2 "     #識別第二個字符串
#識別兩個字符串
}
sum $2 $1
#這后面的$2和$1,代表的是跟在腳本后面的字符串的順序;此處就是設定將第二個字符串放在第一位,將第一個字符串放在第二位顯示結果
[root@localhost opt]# bash j.sh 1 99 1 

需要注意

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

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

遞歸函數

—— 函數的本質就是一個程序,每開一個進程都會消耗資源,無限的開自己死循環就會造成資源的無限占用形成病毒

—— 函數調用自己本身的函數

—— 必須要有結束函數的語句,防止死循環

階乘函數

—— 一個正整數的階乘(factorial)是所有小于及等于該數的正整數的積,并且0和1的階乘為1,自然數n的

—— 階乘寫作 n! =1×2×3×...×n

—— 階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n n!=n(n-1)(n-2)...1 n(n-1)! = n(n-1)(n-2)!

腳本舉例:此腳本作用是計算任意數值的階乘
#!/bin/bash
fact () {
if [ $1 -eq 0  -o  $1 -eq 1 ]
thenecho 1
elseecho $[$1* $(fact $[$1-1])]
#這里將 $[$1-1] 的值再次使用函數 fact 進行執行
#此處 * 為乘
fi
}
fact $1結果展示
[root@localhost opt]# bash digui.sh 5
120
#5的階乘為120

函數的文件

—— 專門存放函數的文件

—— . 絕對路徑的文件名 函數名:從存放函數的文件中,提取使用指定函數(. 可以用 source 代替)


數組

—— 數據的集合稱為數組

  • 普通數組,普通數組可以不事先聲明,直接使用;下標只能是數值

  • 關聯數組,關聯數組必須先聲明,再使用;下標可以自定義任意字符串

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

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

—— 數組名和索引

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

  • 索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash 4.0版本之后開始支持

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

數組的使用

—— 一定要先聲明數組

daclare -a 普通數組(不需要手動聲明,系統幫你聲明了)

—— 關聯數組一定要手動聲明

declare -A 數組名

定義數組

—— 自定義數組名=(數組值中間用空格隔開)

單個調用
echo作用
${a[0]}調用第一個值
${a[1]}調用第二個值
${a[2]}調用第三個值
…………
${a[n]}調用第n個值
全部調用
echo作用
${a[@]} 或者 ${a[*]}顯示所有結果
${#a[@]} 或者 ${#a[*]}統計個數
${!a[@]} 或者 ${!a[*]}顯示所有下標

數組切片

—— 格式:echo ${自定義數組名[@或*]:自定義數字:自定義數字}

—— 注意:以 “:” 為分隔符

例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[@]:1:3}
2 3 4
#從第一個開始并跳過第一個,到后三個結束

數組替換

—— 格式:echo ${自定義數組名[@或*]/查找的目標字符/替換的字符}

—— 注意:以 “/” 為分隔符

例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[@]/2/hi}
1 hi 3 4 5
#查找a數組中第二個字符串,并替換成hi

數組刪除

—— 格式:unset 數組名 //刪除該數組

—— 格式:unset 數組名[n] //選擇數組中的第 n 個刪除;從0開始,0代表第一個字符

例
[root@localhost opt]# a=(1 2 3 4 5)
[root@localhost opt]# echo ${a[*]}
1 2 3 4 5
[root@localhost opt]# unset a[2]            #刪除該數組中第三個字符   
[root@localhost opt]# echo ${a[*]}          #驗證 
1 2 4 5
[root@localhost opt]# unset a               #刪除該數組
[root@localhost opt]# echo ${a[*]}
#不會顯示任何東西

冒泡排序

—— 一種數組排序算法

—— 類似氣泡上涌的動作,會將數據在數組中從小到大或者從大到小不斷的向前移動

—— 基本思想:冒泡排序的基本思想是對比相鄰的兩個元素值,如果滿足條件就交換元素值,把較小的元素移動到數組前面,把大的元素移動到數組后面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升到頂部

—— 算法思路:冒泡算法由雙層循環實現,其中外部循環用于控制排序輪數,一般為要排序的數組長度減1次,因為最后一次循環只剩下一個數組元素,不需要對比,同時數組已經完成排序了,而內部循環主要用于對比數組中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數隨排序輪數而減少

腳本舉例:此腳本是隨機生成十個不同的數字并進行從小到大排序
#!/bin/bash
for  i  in {0..9}
do
a[$i]=$RANDOM
done
#生成一個擁有十個隨機數的數組
echo "原始數組: ${a[@]}"l=${#a[@]}
#定義變量l 等同于數組的總個數;此處 l=10
for((i=1;i<$l;i++))
#需要進行比較的次數
dofor ((j=0;j<$l-$i;j++))#相鄰的數字,需要比較的次數dofirst=${a[$j]}#數組的第 n個數k=$[$j+1]#數組的 n+1大小的下標second=${a[$k]}#數組的第 n+1個數if [ $first  -gt  $second ]thentemp=$firsta[$j]=$seconda[$k]=$temp#該三行是將兩個數字進行更換位置fidone
doneecho "從小到大:  ${a[@]}" 

腳本舉例

比較隨機數字的數組大小
#!/bin/bash
for a in {0..9}
dob[$a]=$RANDOM[ $a -eq 0 ] && min=${b[0]} && max=${b[0]}[ ${b[$a]} -gt $max ] && max=${b[$a]}[ ${b[$a]} -lt $min ] && min=${b[$a]}
doneecho "數組: ${b[*]}"
echo "最大值: $max"
echo "最小值: $min"

補充命令

scp 腳本名 目標ip

—— 將腳本發送給指定虛擬機

declare 命令補充

—— declare +/- 選項 變量名

選項作用
-賦予變量類型屬性
+取消變量的類型屬性
-a將變量聲明為數組型
-i將變量聲明為整數型
-x將變量聲明為環境變量
-r將變量聲明為只讀變量
-p查看變量的被聲明的類型

eval 命令

—— 格式:eval()

—— 注釋:將任意字符串當成有效的表達式來求值并返回計算結果;如果參數不是字符串類型,則直接返回參數;需要注意的是,使用 eval() 函數時需要謹慎,因為它可以執行任意代碼,存在一定的安全風險

顯示顏色的命令

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

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

相關文章

Vue中動態class方法

1.方法一&#xff1a;只需要展示一個class樣式&#xff0c;但是動態取值 <div :class"aaa"></div>data:{return () {aaa:colorRed} }.colorRed {color: red; } 2.方法二&#xff1a;表達式判斷是否展示class里面的樣式 <div :class"{colorRed…

函數與數組

一.函數 1、函數的作用 定義較為復雜的但是需要重復使用的內容&#xff0c;以便再次使用&#xff0c;可以直接調用&#xff0c;節約時間&#xff0c;提高效率。 語句塊定義成函數約等于別名&#xff0c;定義函數&#xff0c;再引用函數。 封裝的可重復利用的具有特定功能的…

python+django高校科研項目管理系統2u3mx

高校科研項目管理系統采用擬開發的高校科研項目管理系統通過測試,確保在最大負載的情況下穩定運轉,各個模塊工作正常,具有較高的可用性。系統整體界面簡潔美觀,用戶使用簡單,滿足用戶需要。在因特網發展迅猛的當今社會,高校科研項目管理系統必然會成為在數字信息化建設的一個重…

Linux 查看 CPU 信息相關命令

目錄 lscpu top htop lscpu lscpu 命令是用于顯示有關 CPU 架構的信息&#xff0c;而不是用于實時監視 CPU 負載。它提供有關 CPU 類型、核心數、線程數、架構等的詳細信息。 lscpu top 命令會顯示系統的實時狀態&#xff0c;包括 CPU 使用率、內存使用率等。按下鍵盤上的…

一文詳解Vue生命周期

Vue是一種流行的用于構建用戶界面的漸進式JavaScript框架。Vue框架在開發過程中&#xff0c;特別強調對生命周期的理解和管理。通過使用生命周期鉤子函數&#xff0c;開發者能夠精確地控制Vue實例的創建、掛載、更新以及銷毀過程。本文將對Vue的生命周期進行詳細的介紹&#xf…

YOLOv8訓練自己的目標檢測數據集

YOLOv8訓練自己的目標檢測數據集 目錄標題 源碼下載環境配置安裝包訓練自己的數據集數據集文件格式數據集文件配置超參數文件配置訓練數據集命令行訓練腳本.py文件訓練 進行detect顯示detect的效果 源碼下載 YOLOv8官方的GitHub代碼&#xff0c;同時上面也有基礎環境的配置要…

IntelliJ IDEA 16創建Web項目

首先要理解一個概念&#xff1a;在IntelliJ IDEA中“new Project”相當于eclipse中的工作空間&#xff08;Workspace&#xff09;&#xff0c;而“new Module”相當于eclipse中的工程&#xff08;Project&#xff09;。以下均采用Intellij的說法&#xff0c;請自行對照轉換理解…

Maven倉庫清除remote.repositories、lastUpdated、sha1腳本

Maven倉庫清除remote.repositories、lastUpdated、sha1腳本 1. 腳本功能 清除本地maven倉庫的_remote.repositories、sha1、lastUpdated的文件 2. 腳本內容 set REPOSITORY_PATH%cd% rem 搜索中... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*…

Java 關鍵字:synchronized詳解

synchronized詳解 基本使用源碼解析常見面試題好書推薦 基本使用 Java中的synchronized關鍵字用于在多線程環境下確保數據同步。它可以用來修飾方法和代碼塊 當一個線程訪問一個對象的synchronized方法或代碼塊時&#xff0c;其他線程將無法訪問該對象的其他synchronized方法或…

【愚公系列】2023年11月 Java教學課程 188-SpringCloud(Feign遠程調用)

&#x1f3c6; 作者簡介&#xff0c;愚公搬代碼 &#x1f3c6;《頭銜》&#xff1a;華為云特約編輯&#xff0c;華為云云享專家&#xff0c;華為開發者專家&#xff0c;華為產品云測專家&#xff0c;CSDN博客專家&#xff0c;阿里云專家博主&#xff0c;阿里云簽約作者&#xf…

如何通過寶塔面板搭建一個本地MySQL數據庫服務并實現遠程訪問

寶塔安裝MySQL數據庫&#xff0c;并內網穿透實現公網遠程訪問 文章目錄 寶塔安裝MySQL數據庫&#xff0c;并內網穿透實現公網遠程訪問前言1.Mysql服務安裝2.創建數據庫3.安裝cpolar3.2 創建HTTP隧道 4.遠程連接5.固定TCP地址5.1 保留一個固定的公網TCP端口地址5.2 配置固定公網…

浙江師范黃昌勤老師關于情感分析的講座

回放&#xff1a;https://share.weiyun.com/Wvaw4OoY 收獲很大&#xff1a; 寫幾點&#xff0c; 1&#xff1a;小二聚焦 精細更有用 2&#xff1a;高產的秘訣就是 專注一個領域&#xff0c;不斷延展。 3&#xff1a;好的文章技術不是本質&#xff0c;本質還是解決了什么教育問…

九、ffmpeg命令轉封裝

開了幾天小差&#xff0c;今天繼續學習ffmpeg。 準備測試使用的視頻&#xff0c;并查看其信息 # 查看視頻信息。使用Mediainfo也可以 ffprobe test.mp4 視頻格式的信息如下。 保持編碼格式&#xff1a;ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.tsffmpeg -i…

WordPress網站如何修復數千個帖子的SEO錯誤

在本教程中&#xff0c;我們將向您展示如何解決您經常犯的SEO錯誤。 最好的是您不必花費太多時間&#xff0c;因為您不需要打開并編輯每個帖子。 相反&#xff0c;我們將向您展示如何使用 WordPress 內的電子表格來修復 WordPress 帖子的 SEO。 在這里&#xff0c;我們為您提…

nint和Pattern matching介紹(C#)

nint 最近看C# 9.0時&#xff0c;發現一個有意思的關鍵詞&#xff0c;就是nint&#xff0c;第一次看到這個&#xff0c;于是好奇心爆棚&#xff0c;就去實際操作了一下。 nint i 1000; Console.WriteLine("i{0}", i);實際結果與int的結果是一樣的&#xff0c;那為什…

ARM裸機-19(NandFlash和iNand)

1、NandFlash的接口 1.1、Nand的型號與命名 (1)、Nand的型號命名都有含義&#xff0c;就拿K9F2G08來示例分析一下&#xff1a;K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit (256MB)。08表示Nand是8位的 (8位就是數據線有8根)。 (2)、Nand命名中可以看出&#x…

【2023.11.23】JDBC基本連接語法學習?

1.導入jar包依賴&#xff1a;mysql-connector-java-8.0.27.jar 2.連接數據庫&#xff01; 3.無法解析類->導入java.sql.*&#xff0c;&#xff08;將項目方言改為Mysql&#xff09; JDBC&#xff0c;啟動&#xff01;&#xff01; public class Main {public static voi…

如何下載OpenJDK及其源碼

如果想下載 OpenJDK&#xff0c;存在以下幾種辦法&#xff1a; 最簡單的辦法是去 OpenJDK 官網&#xff0c;這里能下載 JDK9 及其以上的版本&#xff0c;還有 JDK 源碼所在的 github 地址。 第二種方法是使用 IDEA 下載&#xff0c;位置在 File->Project Structure->SD…

【Vue】核心特性(響應式)

響應式&#xff1a; 數據變化&#xff0c;視圖自動更新 接下來使用一個例子來體現一下什么是響應式 案例一&#xff1a; 訪問數據&#xff0c;視圖自動更新 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

【人生苦短,我學 Python】(1)初識 Python

目錄 1. 簡述2. 什么是 Python&#xff1f;3. 面向對象簡述3.1 面向過程3.2 面向對象3.3 面向對象的主要優點3.4 面向對象的基本概念3.5 面向對象程序設計 4. Python語言的版本和解釋器5. Python 編程工具6. Python 的三種編程方式7. 簡單的 Python 程序8. 高級一點的 Python 程…