Shell 指令碼學習(1)
一 Shell概覽
1. 自動化批量系統初始化程式(update, 軟體安裝,時區設定,安全策略,...)
2. 自動化批量軟體部署程式(LAMP,LNMP,Tomcat,LVS,Nginx)
3. 應用管理程式(KVM,叢集管理擴容,MySQL)
4. 日誌分析處理程式(PV,UV,200,!200,top 100, grep/awk)
5. 自動化備份恢復程式(MySQL完全備份/增量+Crond)
6. 自動化管理程式(批量遠端修改密碼,軟體升級,配置更新)
7. 自動化資訊採集及監控程式(收集系統/應用狀態資訊,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
8. 配合Zabbix資訊採集
9. 自動化擴容(增加雲主機——>部署應用,業務上線)
10. Shell可以做任何事
二 小程式
1
#!/bin/bash
ping -c1 www.baidu.com $>/dev/null && echo "success" || echo "failed"
"#!":linux系統官方稱呼為Shebang,用來給當前指令碼定義預設直譯器的。
"$>" : 將結果重定向。(標準輸出1,錯誤輸出2)
"&&":前面的命令的返回值為0(即成功),則執行其後命令。
"||":前面的命令返回值為1(即失敗),則執行其後命令
2
#!/usr/bin/bash
#如果使用者沒加引數
if [ $# -eq ];then #-le 小於等於
echo "usage: `basename $0` file"
exit
fi
#如果使用者輸入的引數不是檔案
if [ ! -f $ ];hen
ehco "error file!"
exit
fi for ip in `cat $`
do
ping -c1 $ip &>/dev/null
if [ $? -eq ];then
echo "$ip success"
else
echo "$ip failed"fi
done
3
read -p "Please input a number: " num while true
do
if [[ "$num" =~ ^[-]+$ ]];then #判斷輸入的是否是數字
break;
else
read -p "Please input a number: " num
fi
done
三 命令
"&": 後臺執行;
但後臺執行後,關掉終端後程式會關掉。
"nohup"允許後臺執行的程式,在關掉終端後還可以執行。
"bg"檢視後臺程式;"fg"檢視前臺程式
連貫動作:"ctrl+z"後臺執行,"bg"返回前臺
kill 3 殺死PID為3的程式;kill %3 給當前終端程式號為3的作業發訊號
true永遠返回真,false命令永遠返回假,$?檢視上一條命令返回值
";"只是將一行上的兩個命令分開。
basename 生成路徑中的檔名
dirname 生成路徑中的資料夾名
bash -vs shell指令碼:除錯執行指令碼
seq 數字:輸出從1到數字的所有數字
" ":雙引號是弱引用,裡面變數會被替換
‘ ’:單引號是強引用,裡面變數不會被替換,就是字串
` `反引號 命令替換 等價於$() 反引號中的命令會先被執行
():子shell中之心
(()):數值比較運算
{}:集合
${}:變數引用
[]:條件測試
[[]]:條件測試,支援正則 [[ =~ ]]
$[]:整數運算
四 Shell萬用字元
* 匹配任意多個字元
?匹配任意一個字元
[] 匹配方括號中任意一個字元 [^] 匹配任意非括號中字元
() 在子shell中執行命令
{} 集合 mkdir {1.txt,2txt} 建立1.txt和2.txt檔案
\ 轉義符
小知識:
echo -e "\e[1;31mhello" 顯示的hello為紅色(31m),前景色的數字30-37,後景色的數字40-47
printf "hello %b" damon 格式化輸出 hello damon
五 變數
shell中變數都是字串
1.自定義變數(C語言中的區域性變數)
定義變數: 變數名=變數值 變數名命名規範和c語言一致;
read 變數名 :表示從鍵盤讀入;
read -p "Please input a name: " `name :加提示從鍵盤讀入
引用變數: %變數名 或 ${變數名}; ${#變數名}:變數名長度
檢視變數:echo $變數名 set(所有變數:包括自定義變數和環境變數)
取消變數:unset變數名
作用範圍:僅在當前shell中有效
2.環境變數(C語言中的全域性變數)
定義環境變數:方法一 export v1 = /home/backup
方法二 export v2 將自定義變數轉換成環境變數
引用環境變數:$變數名 或${變數名}
檢視環境變數:echo $變數名 或者 env 例如 env |grep v1
取消環境變數:unset變數名
變數作用範圍:在當前shell和子shell有效
一般我們自己不定義
3.位置變數
$1 $2 $3 $4....
4.預定義變數
$0 指令碼名
$* 所有的引數
[email protected] 所有的引數
$# 所有引數的個數
$$ 當前程式的PID
$! 上一個後臺程式的PID
$? 上一個命令的返回值(0便是成功)
六 變數的運算
1.整數運算
方法一:expr 1 + 2 + - \* / %
方法二:$((1 + 2)) + - * / %
方法三:$[1+2] + - * / %
方法四:let; let num = 1 + 2; echo $sum
2.小數運算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
echo "printf 5.0/2" |python
3.變數內容的刪除和替換
url=www.baidu,com.cn
echo ${#url} #顯示 變數長度
echo ${url#*.} #顯示 變數從前往後刪除到第一個點的後的字串
echo ${url##*.} #顯示 變數從前往後刪除到最後一個點後的字串
echo ${url%.*} #顯示 變數從後往前刪除到第一個點後的字串
echo ${url%%.*} #顯示 變數從後往前刪除到最後一個點後的字串 #變數切片
echo ${url:0:5} #顯示 從第0位數5為的字串
echo ${url:3} #顯示 從第3位到最後的字串 #變數內容替換
echo ${url/sina/baidu} #顯示 將sina替換成baidu的字串
echo ${url//n/N} #顯示 將所有m替換成N的字串 #變數的替代
${變數名-新的變數值}
變數沒有被定義:會使用“新的變數值”替代
變數有被定義:不會被替代 ${變數名:-新的變數值}
變數沒有被定義或者被定義但是空值:會使用“新的變數值”替代
變數有被定義且不為空值:不會被替代
${變數名+新的變數值}
變數沒有被定義:不會被替代
變數有被定義:會被新值替代
${變數名:+新的變數值}
變數沒有被定義或值為空:不會被替代
變數有被定義且值不為空:會被新值替代
${變數名=新的變數值}
變數被定義且值為空:不會被替代
變數沒有被定義或值不為空:會被新值替代
${變數名:=新的變數值}
變數沒有被定義或值為空:會被替代
變數有被定義且值不為空:不會被新值替代
七 執行指令碼
./test.sh 需要執行許可權 在子shell中執行
bash test.sh 不需要執行許可權 在子shell中執行
. test.sh 不需要執行許可權 在當前shell中執行
source test.sh 不需要執行許可權 在當前shell中執行
提示:通常修改系統配置檔案如/etc/profile 的 PATH等變數後,使之在當前shell中執行
sh -n test.sh 僅除錯syntax error
sh -vx test.sh 以除錯方式執行,查詢整個執行過程