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 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到數字的所有數字

" ":雙引號是弱引用,裏面變量會被替換

‘ ’:單引號是強引用,裏面變量不會被替換,就是字符串

` `反引號 命令替換 等價於$() 反引號中的命令會先被執行

():子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 腳本名

$* 所有的參數

$@ 所有的參數

$# 所有參數的個數

$$ 當前進程的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   以調試方式執行,查詢整個執行過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章