一 Shell概覽python
1. 自動化批量系統初始化程序(update, 軟件安裝,時區設置,安全策略,...)linux
2. 自動化批量軟件部署程序(LAMP,LNMP,Tomcat,LVS,Nginx)shell
3. 應用管理程序(KVM,集羣管理擴容,MySQL)小程序
4. 日誌分析處理程序(PV,UV,200,!200,top 100, grep/awk)vim
5. 自動化備份恢復程序(MySQL徹底備份/增量+Crond)安全
6. 自動化管理程序(批量遠程修改密碼,軟件升級,配置更新)bash
7. 自動化信息採集及監控程序(收集系統/應用狀態信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)測試
8. 配合Zabbix信息採集url
9. 自動化擴容(增長雲主機——>部署應用,業務上線)spa
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 0 ];then #-le 小於等於
echo "usage: `basename $0` file" exit fi #若是用戶輸入的參數不是文件 if [ ! -f $1 ];hen ehco "error file!" exit fi
for ip in `cat $1` do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip success"
else
echo "$ip failed"
fi
done
3
read -p "Please input a number: " num while true
do
if [[ "$num" =~ ^[0-9]+$ ]];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到數字的全部數字 -w等位補齊
grep 內容 文件:過濾出文件中存在內容的地方
crontab -e 定時執行腳本
bash -n 腳本名:檢測腳本語法
id user:判斷用戶是否存在
command -v 命令名:判斷是否存在這個命令
time 統計程序或腳本的執行時間
trap "" HUP INT OUIT TSTP:捕捉鍵盤輸入的信號 執行""操做
" ":雙引號是弱引用,裏面變量會被替換
‘ ’:單引號是強引用,裏面變量不會被替換,就是字符串
` `反引號 命令替換 等價於$() 反引號中的命令會先被執行
():子shell中之心
(()):數值比較運算
{}:集合
${}:變量引用
[]:條件測試
[[]]:條件測試,支持正則 [[ =~ ]]
$[]:整數運算
四 Shell通配符
* 匹配任意多個字符
?匹配任意一個字符
[] 匹配方括號中任意一個字符 [^] 匹配任意非括號中字符
() 在子shell中執行命令
{} 集合 mkdir {1.txt,2txt} 建立1.txt和2.txt文件
\ 轉義符
小知識:
1. echo -e "\e[1;31mhello" 顯示的hello爲紅色(31m),前景色的數字30-37,後景色的數字40-47
printf "hello %b" damon 格式化輸出 hello damon
2. vim中 yy複製當前行,p粘貼到當前光標處
dd刪除當前行
五 變量
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 腳本名
$* 全部的參數
$@ 全部的參數
$# 全部參數的個數
$$ 當前進程的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 以調試方式執行,查詢整個執行過程