shell進階函數及數組

①函數
②數組
③字符串切片
④變量高級進階
⑤expect工具

函數基礎
? ? ? ? ? 函數:模式化編程:最大化的代碼重用,最小化的代碼冗余
? ? ? ? ? 函數:function,功能組件
? ? ? ? ? ? ? ? ? ? ? ? ? 可被調用:函數有函數名
? ? ? ? ? ? ? ? ? ? ? ? ? 函數出現的地方,而自動被替換成函數定義的代碼
函數定義
? ? ? ? ? 語法:
? ? ? ? ? ? ? ? ? FuncName() { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? function FuncName {
? ? ? ? ? ? ? ? ? ? ? ? ? 函數體 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 函數體
? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? 函數定義好以后,被調用時才執行函數體內容
函數有兩種返回值:
? ? ? ? ? 執行結果:正常程序輸出
? ? ? ? ? 狀態結果:函數體中調用命令的輸出結果
函數的退出狀態碼:
? ? ? ? ? return 從函數中返回,用最后一條命令的退出狀態碼
? ? ? ? ? return 0 無錯誤返回
? ? ? ? ? return 1-255 有錯誤返回
函數可以接收參數:
? ? ? ? ? 在函數體可以使用類似腳本調用位置參數一樣的參數
函數調用(函數在使用前必須定義,調用函數僅使用其函數名即可)
? ? ? ? ? ? ? ? ? 載入函數: source 函數腳本 或 . FuncName (注:載入函數時文件路徑要填寫完整)
? ? ? ? ? ? ? ? ? 查看函數:declare -xf FuncName
? ? ? ? ? ? ? ? ? 刪除函數:unset FuncName
? ? ? ? ? ? ? ? ? 調用函數:FuncName
? ? ? ? ? ? ? ? ? 調用并傳遞參數:FuncName $1
? ? ? ? ? ? ? ? ? 定義全局函數:export -f FuncName
? ? ? ? ? ? ? ? ? 查看全局函數:export -xf FuncName
函數變量作用域
? ? ? ? ? ? ? ? ? 變量在聲明的位置決定了其作用域
? ? ? ? ? ? ? ? ? 環境變量:當前shell和子shell有效(子shell賦值并不影響父級進程)
? ? ? ? ? ? ? ? ? 本地變量:只在當前shell進程有效,為執行腳本會啟動專用子shell進程;因此,本地變量的作用范圍是在當前shell腳本程序文件,包括腳本中的函數
? ? ? ? ? ? ? ? ? 局部變量:函數的周期生命;函數結束時變量被自動銷毀
? ? ? ? ? ? ? ? ? ? ? ? ? local NAME=VILUE 函數內部有效
函數遞歸
? ? ? ? ? 函數直接或間接調用自身,注意遞歸層數
小結:
? ? ? ? ? 傳遞給腳本的參數,函數本身并不調用
? ? ? ? ? 只有傳遞給函數以后 ,函數體才能調用傳遞給腳本的參數
? ? ? ? ? 在函數中使用了在主程序中聲明的變量,重新賦值會直接修改主程序中的變量
? ? ? ? ? 如果不期望函數與主程序中的變量沖突,函數中使用變量都用local修飾,
? ? ? ? ? 在函數中使用了在主程序中沒有聲明的變量,在函數執行結束后即被撤銷

—————————————————————————————————————————-
數組:儲存多個元素的連續的內存空間,相當于多個變量的集合
? ? ? ? ? 數組名和索引
? ? ? ? ? ? ? ? ? 索引:編號從0開始,屬于數值索引
? ? ? ? ? ? ? ? ? 索引可支持使用自定義格式,而不僅是數值格式,自定義格式的就叫關聯數組
? ? ? ? ?聲明數組:注:兩者不可相互轉換
? ? ? ? ? ? ? ? ? declare -a arrayName
? ? ? ? ? ? ? ? ? declare -A arrayName(關聯數組)
初始化或賦值:各元素之間使用空白字符隔開
? ? ? ? ? 語法:
? ? ? ? ? ? ? ? ? arrayName[0]=’a’;arrayName[1]=’b’? ? ? ?#按照下標單個賦值
? ? ? ? ? ? ? ? ? arrayName=(‘a’ ‘b’ ‘c’) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #一次賦值全部元素,以空格隔開
? ? ? ? ? ? ? ? ? arrayName=([index]=’a’ [index]=’b’)? ? ? #按照索引賦值,(稀疏格式用)
? ? ? ? ? ? ? ? ? read -a arrayName ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#交互式賦值
? ? ? ? ? 顯示所有數組:declare -a
? ? ? ? ? ? ? ? ?${#arrayName[@]},${#arrayName[*]} #獲取數組中有效元素的個數
? ? ? ? ? ? ? ? ?${#arrayName[index]} (index=0,1,2….) #獲取某一元素中字符串的長度

引用數組
? ? ? ? ? ? ? ? ?引用數組元素: ${arrayName[index]}
? ? ? ? ? ? ? ? ?引用數組所有元素: ${arrayName[*]} 或者 ${arrayName[@]}
? ? ? ? ? ? ? ? ?數組中元素的個數: ${#arrayName[*]} 或者 ${#arrayName[@]}
刪除數組
? ? ? ? ? ? ? ? ?刪除數組的某元素: unset arrayName[index]
? ? ? ? ? ? ? ? ?刪除整個數組: unset arrayName
引用數組中的元素:
? ? ? ? ? ? ? ? ?數組切片: ${arrayName[@]:要跳過的元素個數:要取出的元素個數}
? ? ? ? ? ? ? ? ?取偏移量之后的所有元素 ${arrayName[@]:要跳過的元素個數}
? ? ? ? ? ? ? ? ?向數組中追加元素: arrayName[${arrayName[*]}]=value
關聯數組:關聯數組必須先聲明再調用
? ? ? ? ? ? ? ? ?declare -A arrayName
? ? ? ? ? ? ? ? ?arrayName=([index]=’a’ [index]=’b’)
—————————————————————————————————————————-
字符串切片
${#name}: ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? 返回字符串長度
${name:3}: ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ?從3開始返回字符串(位偏移)
${name:3:4}: ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ?從3開始從左向右取4位
${name:-3}: ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ?最后3位的字符串
${name:3:-4}: ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ?從第3位開始 至最后倒數4位為止
${name: -4:-2}: ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?從右往左取4位,然后在從后往前取2位 (ContOS7可運行)
基于模式取字符串
${name#*word}:? ? ? ? ? ? ? ? ?word可以是指定字符串,查找從字符串中word(查找1次)開頭往右的所有內容
${name##*word}:? ? ? ? ? ? ? word可以是指定字符串,查找從字符串中word(查找所有)開頭往右的所有內容
${name%word*}:? ? ? ? ? ? ? ? ?從右至左開始查找(查找1次)
${name%%word*}:? ? ? ? ? ? ? 從右至左開始查找(查找所有)
查找替換
${name/1/2}:? ? ? ? ? ? ? ? ? ? ?從左邊至右查找1,替換為2(替換1次)
${name//1/2}:? ? ? ? ? ? ? ? ? ?從左邊至右查找1,替換為2(替換所有)
${name/#1/2}:? ? ? ? ? ? ? ? ? 從左邊至右查找1,替換為2
${name/%1/2}:? ? ? ? ? ? ? ? ?從右邊至左查找1,替換為2
查找刪除
${name/1/2}:? ? ? ? ? ? ? ? ? ?從左邊至右查找1(查找1次),刪除1及之后的內容
${name//1/2}:? ? ? ? ? ? ? ? ?從左邊至右查找1(查找1次),刪除1及之后的內容
小結
? ? ? ? ? ? ? ? ?*表示所有字符串內容,放在首部表示從左往右,放在尾部表示從右往左
? ? ? ? ? ? ? ? ?#表示字符串開頭,%表字符串結尾
? ? ? ? ? ? ? ? ?如需要全部替換字符串內容(貪婪模式)需輸入2次,例:## //
變量賦值
? ? ? ? ? ? ? ? ?根據一個字符串的狀態情況賦值給另外一個字符串(相當于簡單的if判斷)
shell進階函數及數組clipboard
有類變量:shell里變量默認都是無類型變量
? ? ? ? ? declare命令:指定變量類型
? ? ? ? ? ? ? ? ?語法:declare [選項]變量名
? ? ? ? ? ? ? ? ?-r: 聲明或顯示只讀變量
? ? ? ? ? ? ? ? ?-i: 將變量定義為整形數
? ? ? ? ? ? ? ? ?-a: 將變量定義為數組
? ? ? ? ? ? ? ? ?-A: 將變量定義為關聯數組
? ? ? ? ? ? ? ? ?-f: 顯示已定義的所有函數名及其內容
? ? ? ? ? ? ? ? ?-F: 僅顯示已定義的所有函數名
? ? ? ? ? ? ? ? ?-x: 聲明或顯示環境變量和函數
? ? ? ? ? ? ? ? ?-l: 聲明變量為小寫字母
? ? ? ? ? ? ? ? ?-u: 聲明變量為大寫字母
eval命令:掃描命令里是否有變量,替換為變量值.在執行命令
間接變量引用
? ? ? ? ? 如果第一個變量的值是第二個變量的名字,從第一個變量引用第二個變量的值
? ? ? ? ? 第二個變量可以為命令
? ? ? ? ? ? ? ? ? 例:? ?num=`echo {1..10}|tr ” ” “+”|bc`
? ? ? ? ? ? ? ? ? ? ? ? ? sum=$num
? ? ? ? ? ? ? ? ? ? ? ? ? echo $sum
? ? ? ? ? ? ? ? ? ? ? ? ? sum=55
mktemp命令:創建臨時文件
? ? ? ? ? 語法:mktemp [選項] nameXXX 注:XXX為隨機字符至少指定3位
? ? ? ? ? 選項:
? ? ? ? ? ? ? ? ? -d 創建臨時目錄
? ? ? ? ? ? ? ? ? -p 指定臨時文件所存放的目錄
install命令:安裝復制文件
? ? ? ? ? 語法:install [選項]
? ? ? ? ? 參數:
? ? ? ? ? ? ? ? ? -d: 創建文件夾
? ? ? ? ? ? ? ? ? -t: 創建空文件夾
? ? ? ? ? 選項:
? ? ? ? ? ? ? ? ? -m: 指定權限,默認755
? ? ? ? ? ? ? ? ? -o: 指定用戶,所有者
? ? ? ? ? ? ? ? ? -g: 指定組,所屬組
expect工具:主要應用于自動化交互式操作的場景,適用于對多臺服務器執行相同操作
? ? ? ? ? yum install expect需要安裝包
? ? ? ? ? 語法:expect (tcl語言 模式 動作)
? ? ? ? ? 選項:
? ? ? ? ? ? ? ? ? -c:從命令行執行expect腳本, 默認交互執行
? ? ? ? ? ? ? ? ? -d:可以輸入輸出調試信息
expect中相關命令
? ? ? ? ? ? ? ? ? spawn:啟動新的進程
? ? ? ? ? ? ? ? ? send:用于向進程發送字符串
? ? ? ? ? ? ? ? ? expect:從進程接收字符串 期望收到\t(回車)
? ? ? ? ? ? ? ? ? interact:允許用戶交互
? ? ? ? ? ? ? ? ? exp_continue:匹配多個字符串在執行動作后加此命令

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98252

(0)
簡單不簡單簡單不簡單
上一篇 2018-05-12
下一篇 2018-05-12

相關推薦

  • grep運用及深化

    grep運用及深化
    知識點:1.https://blog.csdn.net/weixin_36689020/article/details/53230529
    2.https://www.cnblogs.com/tsw1107/p/2264a01aeec481d2044dfeda01417c64.html

    Linux筆記 2018-06-03
  • dns看圖來配,思路一下明了

      1.子域授權: 每個域的名稱服務器,都是通過其上級名稱服務在解析庫中進行授權。 如:根域授權頂級域是怎么做的? 說明.com.這個域?? 它的ns服務器是主機名ns1.com.;2.com. .com.???? IN? NS??? ns1.com. .com.???? IN? NS??? ns2.com. ns1.com.?? IN?? A??…

    Linux筆記 2018-06-03
  • 虛擬機系統

    系統安裝

    2018-04-01
  • 任務計劃

    任務計劃

    2018-06-05
  • grep與vim工具基本命令詳解

    本文記錄了些我在學習grep與vim時記錄的一些筆記,希望可以幫到大家

    2018-04-06
  • sed作業

    編程基礎 程序:指令+數據程序編程風格:過程式:以指令為中心,數據服務于指令對象式:以數據為中心,指令服務于數據shell程序:提供了編程能力,解釋執行 程序的執行方式 計算機:運行二進制指令編程語言:低級:匯編高級:編譯:高級語言–>編譯器–>目標代碼?java,C#解釋:高級語言–>解釋器&#8211…

    2018-04-15
欧美性久久久久