1. 程式人生 > 實用技巧 >Shell 指令碼學習(1)

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 以除錯方式執行,查詢整個執行過程