前言
bash(Bourne-Again SHell)是一種過程式編程語言、是人機交互接口,它是解釋型語言(源程序->解釋器去讀取執行)也稱爲動態語言,解釋型無法脫離解釋器獨立運行,bash是弱類型,保存變量方式一切皆字符。
概念
腳本:將希望執行的命令羅列在文件中一起執行,bash沒有庫,整個程序都依賴於命令完成,在腳本中命令語句執行失敗並不影響後續命令執行,如果語法錯誤後續所有命令將不再執行。
格式:第一行用於指定解釋器類型#!/bin/bash,其他以#開頭的都爲註釋行。
bash變量:
本地變量 :只對當前shell進程有效,其他shell和子shell進程無效
環境變量:當前shell和子shell進程有效,其他 shell進程無效
局部變量:對某shell腳本代碼片段有效
位置變量:記錄所傳參數對應信息,當傳遞參數大於等於10後需要{}如:${10},$#:顯示傳遞參數的個數。$@和$*:顯示所有參數內容、shift:把當前變量銷燬讓下一個變量取代當前變量位置
特殊變量:有特殊意義的變量如:$?、$$
控制語句:
順序執行:
選擇執行:多分支,當滿足條件後執行對應分支,if和case,case有多個測試條件時,case語句會使得語法結構更清晰。
循環執行:同一段代碼執行多次,必須有退出機制否則死循環,for、while、until,循環while和until(while適用於循環次數未知,或不便用for直接生成較大列表時使用)
循環執行中有2個命令可以控制循環跳出或結束操作
continue:跳出本次操作
break:跳出本循環
變量賦值:向變量空間保存數據name=value。
變量引用:讀取變量空間數據echo ${name}。
撤銷變量:unset name。
只讀變量:readonly name(當設置爲只讀變量後變量值將不能修改和撤銷)。
查看當前shell進程中所有變量:set,
查看當前shell中環境變量:export、printenv、env
bash:
-n:scriptfile可做語法測試檢查、
-x:顯示單步執行腳本結果
bash配置文件:
profile類:爲交互式登錄用戶提供配置
全局:/etc/profile和/etc/profile.d/*.sh
個人:~/.bash_profile
bashrc類:爲非交互式用戶提供配置
全局:/etc/bashrc
個人:~/.bashrc
bash操作符(+、-、*、/、%、**)這些稱之爲雙目運算符
整數比較:(-gt(>)、-lt(<)、-ge(>=)、-le(<=)、-eq(==)、-nq(!=))
字符串比較:(<、>、=~(模式匹配)、==、!=)
還包括2個單目運算符:
-n 檢查文件內容是否爲空,不空爲真,空爲假
-z 和-n相反空爲真,不空假
文件測試:
-e:存在爲真
-f:存在並且爲普通文件
-d:存在並且爲目錄、
-l或-L:存在併爲鏈接文件、
-s:存在並且爲非空文件、
-b:塊設備、
-c:字符設備、
-S:套接字文件、
-p:命名管道、
-r、-w、-x:存在並且可讀、可寫、可執行、
-nt: 雙目運算 判斷file1的mtime(修改時間)新於file2
組合條件測試:(與(-a)&&、或(-o)||、非(-not)!)
bash編程函數:函數名出現的地方,會被自動替換爲函數體,函數可自定義返回值,還可以接受位置參數。
bash數組:bash中只支持一維數組並且支持稀疏格式,在引用是必須使用${}查看相關值。
選擇執行操作
if:格式有三種
1、 if 測試條件;then 2、if 測試條件;then 3、if 測試條件1;then
選擇分支 選擇分支1 選擇分支1
fi else elif 條件2;then
選擇分支2 分支2
fi else
分支3
fi
if [ -d /media/sysroot$(dirname $i) ];then [ -f /media/sysroot$i ] || cp $i /media/sysroot$i elif [ ! -d /media/sysroot ];then mkdir -p /media/sysroot$(dirname $i) [ -f /media/sysroot$i ] || cp $i /media/sysroot$i else exit 3 fi
case:格式
case 變量引用 in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
*)
分支n
;;
esac
read -p "Please select the compression method(xz | gz | bz2):" Compression etc="etc-`date +%Y-%m-%d-%H-%M-%S`" case $Compression in xz) tar Jcf "$etc.tar.xz" /etc/* if [ ! -d /backups ];then mkdir -p /backups fi mv "$etc.tar.xz" /backups/ ;; gz) tar zcf "$etc.tar.gz" /etc/* if [ ! -d /backups ];then mkdir -p /backups fi mv "$etc.tar.gz" /backups/ ;; bz2) tar jcf "$etc.tar.bz2" /etc/* if [ ! -d /backups ];then mkdir -p /backups fi mv "$etc.tar.bz2" /backups/ ;; *) echo "you inpot error:" exit 5 ;; esac
循環執行操作
for:格式
for VAR_NAME in LIST;do
循環體
done
for ((i=1;i<=9;i++));do for ((z=1;z<=$i;z++));do let tmp="$i*$z" arr[$z]="$i*$z=$tmp" done echo "${arr[@]}" done
while測試條件爲真,進入循環,until和while相反,判斷爲假進入循環
while:格式 until:格式
while 測試條件;do while 測試條件;do
循環體 循環體
done done
數組操作
賦值:
一次對多個元素賦值:例如:array=(red blue yellow green)
按索引進行賦值: 例如:array=([0]=green [3]=red [2]=blue [6]=yellow)
命令替換賦值: 例如:array=($(ls /opt/script/))或array=(/etc/sysconfig/*)
用戶輸入賦值: 例如:read -a array,賦值後用echo ${array[0]}查看
bash取值:
echo ${#array[2]}。獲取這個數組字符的個數
echo ${#array[*]}或echo ${#array[@]}。獲取這個數組中變量個數
echo ${array[@]}。取出所有元素
${ARRAY[@]:offset:number}。例如:echo ${array[@]:1:1}
offset: 偏移的元素個數
number: 取出的元素的個數
字符串操作
字符串操作
字符串切片:${string:offset:length}。例如:${array[1]:0:5}可以對該數組內1的變量截取0-5個字符串。
取尾部指定個數的字符:${string: -length},中間需要有個空格,從右向左取多少個字符。例如echo ${string: -3}
取子串:
基於非貪婪模式:${string#*word}:從左向右截取第一次出現該字符串後的值例如:echo ${string#*a}
基於貪婪模式:${string##*word}:從左向右截取最後一次出現該字符串後的值例如:echo ${string#*a}
${string%word*}:從右向左取第一次出現該字符串後的值。例如:echo ${string%a*}
${string%word*}:從右向左取最後一次出現該字符串後的值。例如:echo ${string%%a*}
查找替換:
${string/pattern/substi}: 替換第一次出現。例如:echo ${string/d/xxx}
${string//pattern/substi}:替換所有的出現。例如:echo ${string//d/xxx}
${string/#pattern/substi}:只替換行首echo ${string/#d/xxx}
${string/%pattern/substi}:只替換行尾echo ${string/%d/xxx}
查找刪除:
${string/pattern}刪除第一次出現的字符
${string//pattern}刪除所有出現的字符
${string/#pattern}刪除行首出現的字符
${string/%pattern}刪除行尾出現的字符
大小寫轉換:
echo ${string^^}小-->大
echo ${string,,}大-->小
變量賦值:${parameter:-word}:如果變量值爲空將顯示指定字符串,不空顯示自身已有值,例如:${string:-test}
${parameter:=word}:如果變量值爲空將顯示指定字符串,變量將被賦值。例如:${string:=test}
${parameter:?word}:如果變量爲空將把指定字符串作爲錯誤信息顯示。${string:?error}
${parameter:+word}:如果變量有值將顯示指定字符串,爲空將顯示空。例如:${string:+xxxx}