- 變量
- echo $name 與 echo “$name” 假如變量是讀取文件,前者會自動縮進成一行,后者保留原有格式
- (umask=022,mkdir /f1)括號相當于開啟一個臨時子進程,能讀取當前shall的變量等信息,但是進程號不變,命令結束后恢復剛才狀態
- 局部變量,環境變量,只讀變量(常量),位置變量,數組
- 局部變量:只在當前shall有效
- 環境變量:可以傳給子進程。
- 設置環境變量 export 變量名 decler -x 變量名
- 查看環境變量 export env decler -x
- 只讀變量(常量):不可更改的變量
- 設置 decler -r 變量名 readonly 變量名
- 位置變量
- $n 第n個參數 ,$*所有參數當成一個字符串,$@所有參數分開傳輸,$#參數個數
- $0文件名加路徑 若程序建立軟連接,使用軟連接$0顯示的是軟連接路徑和名字
- $10 不是變量10,而是變量1加上0,如果想表示變量10要用{}括起來,${10}
- set — 清除位置變量參數
- shift 參數左移,默認是1,可以指定
- 數組:存儲多個元素的連接的內存空間
- 組成數組名和索引(默認從0開始,也可以自定義。bash4.0以前的版本不支持自定義數組)
- 申明數組:declare -a 通常意義的數組 -A 指關聯數組
- 數組的賦值
- 一次只賦值一個 name[index]=value
- 一次賦值全部 name=(value1 value2…)
- 只賦值特定值 name=([0]=value1 [1]=value2)
- read -a
- 引用數組:
- 所有元素
- ${#name[*]]} 數組name中的參數個數
- ${name[@ | *]} 引用所有參數
- ${!typenum[@]}數組成員
- 數組切片
- ${name[@]:offset:number} offset要跳過的參數 number要取出的參數
- 所有元素
- bash內置字符串處理
- 字符串切片
- ${var:offset:number}
- var=1234 ${var:1:2} =23
- ${var: -n} 取字符串最右側的幾個字符 :-n前面一定要有空格
- v=1234 ${var: -2} =34
- ${var:offset:number}
- 基于模式取字段
- ${var#*word} 從左往右刪除第一個word以前的字符串
- ${var##*word} 從左往右刪除最后一個word以前的字符串
- ${var%word*} 從右往左刪除第一個word以前的字符串
- ${var%%word*} 從右往左刪除最后一個word以前的字符串
- 查找替換
- ${var/a/b} 查找var中的a找到第一個后替換成b
- ${var//a/b} 查找var中的a后全部替換成b
- ${var/ # a/b} 查找var中的以行首的a找到第一個后替換成b
- ${var/ %a/b} 查找var中的以行尾的a找到第一個后替換成b
- 刪除
- ${var/a/} 刪除var中的第一個a
- 大小寫轉換
- ${var^^} 把所有字符轉為大寫
- ${var,,} 把所有字符轉為小寫
- 變量臨時賦值
- ${var:-a} 如果var沒有值,則給var臨時賦值為a;如果var值則返回原來值
- ${var:=a} 如果var沒有值,則給var賦值為a;如果var值則返回原來值
- ${var:+a} 如果var有值,則給var臨時賦值為a;沒有值則不賦值
- 字符串切片
- 為腳本使用配置文件
- 在腳本中使用. filename 或者source filename
- 算術運算
- x=10 y=20 let z=x+y ;let z++ 先處理z再加1,let ++z,先加1在處理z;let z+=1 為z+1
- z=$[x+y] ; z=((x+y))
- a=100 b=110 a^b=010
- a與b的值互換 a=[a^b], b=[a^b] a=[a^b]
- 短路與與短路或 cmd1 && cmd2 || cmd3
- 假如cmd1成功執行cmd2,不執行cmd3,;否則相反
- cmd1 || cmd2 && cmd3 無論cmd1是否正常,cmd3都會執行
- 條件判斷
- test 【】
- [[ == ]] 支持通配符 [[ =~ ]] 支持正則
- -a并且 -o或 -z為空 -s文件存在且非空 -e文件存在(所有文件類型包括目錄) -f普通文件
- eq等于;ne不等于;lt小于;le小于等于;gt大于;ge大于等于
- test 【】
- 統配符
- read 讀取輸入并賦值
- – p輸入提示 -t規定結束時間 -s靜默,不顯示輸入內容
- 批量賦值
- read a s d >>> x y z read a s d < f1 參數要在一行
- if 語句
- 單分支 : if 條件 ;then ; fi
- 雙分支: if 條件 ; then ; else ; if
- 多分支:
- 循環
- while [ true ] ;do ;done?[ ]進行條件判讀成立進入循環,不成立則退出循環
- until [ false ] ;do ;done?與while相反,不成立進入循環,成立退出循環
- 特殊格式
- while read var ;do ;done </etc/passwd var等于讀取行的變量
- 特殊格式
- for var in {} ;do ;done?{}是變量var的取值范圍
- 特殊格式 for ((控制變量初始化;條件判斷;控制變量修正)) ;do ;done
- declare -i sum=0 for ((i=1;i<=100;i++));do let sum+=$i ;done
- 特殊格式 for ((控制變量初始化;條件判斷;控制變量修正)) ;do ;done
- 循環控制語句
- continue 【n】跳過循環 break 【n】 中斷循環
- continue 例子
- 除了5不打印都打印
-
- 打印3遍1到4。
- continue 例子
- case
- select循環與菜單
- select 變量 in values;do ;done
- 用戶輸入參數在內置變量REPLY中 ;請求輸入的提示符修改PS3;死循環和case組合
-
- select 變量 in values;do ;done
- 多參數處理時偏移參數
-
- 并行處理
-
- 信號捕捉trap
- trap ‘ ‘ 忽略信號 ;’-‘恢復信號;-p列出自定義信號
- continue 【n】跳過循環 break 【n】 中斷循環
- 函數:過程式編程,代碼重用 ,以實現結構化編碼或模塊化編碼
- 語法
- 1 fuction f_name { 代碼 }
- 2 f_name() { 代碼 }
- 函數的生命周期調用時創建,返回時終止:return命令自定義狀態結果 0成功,return定于后面的命令不再執行。
- 函數中變量如果和本地變量一樣,在函數中重新申明的話不會影響本地變量;不申明的話函數中變量運算會影響本地變量。
- 語法
- 函數遞歸:函數直接或者間接調用自身
- fact () {
- if [$1 -eq 0 -o $1 -eq 1]; then
- echo 1
- else
- echo $[$1*$(fact $[$1-1])
- fi
- if [$1 -eq 0 -o $1 -eq 1]; then
- fact () {
- ezpect 在腳本中自動與交互命令交互(基于tcl要確認安裝)
- 確認程序是否安裝which tcl
- 語法及命令:
- spawn:啟動的新進程;interact:允許交互;exp_continue:匹配多個字符后加此命令
- send:像進程發送的字符串;expect:從進程接受到的字符串
- 單分支: expect “hi”{send “good\n”} 匹配到hi的時候輸入
- 多分支:expect “hi”{send “good\n”}\
- ”hehe“ {send “good\n”}
-
- eval 掃描命令進行置換
- cs=whoami ; eaval $csroot
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98471