shell腳本

1.shell腳本初識

1.1多行註釋方法

方法一:
讓某一列輸入相同的內容
1.ctrl+shift+v
 2.而後按上下箭頭,移動光標
3.shift+i
 4.輸入內容
5.按下esc
就能讓某一列輸入相同的內容,可用於多行註釋
方法二:
:<<EOF
 echo "comment1"
 EOF
方法三:
cat >/dev/null<<EOF
 echo "coment2"
 EOF
腳本案例

[root@node2 scripts]# cat comment.sh
 #!/bin/bash
 #description:comment of many lines
 #author:vita
 #version:1.0
 :<<EOF
 echo "comment1"
 EOF
 cat >/dev/null<<EOF
 echo "coment2"
 EOF
 echo "coment3"

[root@node2 scripts]# sh comment.sh
 coment3

1.2 Shell腳本的執行

1.bash script-name或sh script-name
這是當腳本文件自己沒有可執行權限(即文件權限屬性x位爲-號)時常使用的方法,
或者腳本文件開頭沒有指定解釋器時須要使用的方法,
這是推薦的腳本執行方法。

2.path/script-name或./script-name
指在當前路徑下執行腳本(腳本要有執行權限),須要先將腳本文件的權限改成可執行(即文件權限屬性加x位)
具體方法爲chmod +x script-name。而後經過腳本絕對路徑或相對路徑就能夠直接執行腳本了。

3.source script-name或. script-name

4.sh<script-name或cat scripts-name|sh

shell腳本
shell腳本

1.3Shell腳本的編程規範和習慣

1.開頭加腳本解釋器
2.附帶做者及版權信息
3.腳本擴展名爲*.sh
 4.腳本存放在固定的目錄下
5.腳本中不用中文
6.成對的符號一次書寫完成
7.循環格式一次性輸入

2.shell變量

2.1Shell變量知識

2.1.1什麼是變量?

在小學或初中時,咱們開始接觸數學方程式,例如:已知x=1,y=x+1,那麼y等於多少?
 在上述問題中,等號左邊的x和y當時被稱作未知數,但在Shell編程裏就叫作變量名,等號右邊的1和x+1則是變量的內容(變量的值)。
 注意,這裏的等號符號被稱爲賦值,而不是等號。

2.1.2.Shell變量特性

默認狀況下,在bash Shell中是不會區分變量是什麼類型的,例如:常見的變量類型爲整數、字符串、小數等。

2.1.3.Shell變量分類

變量可分爲兩類:
 環境變量(全局變量)和普通變量(局部變量)。
 環境變量也可稱爲全局變量,能夠在建立他們的Shell及其派生出來的任意子進程Shell中使用,
 環境變量又可分爲自定義環境變量和bash內置的環境變量。
 普通變量也可稱爲局部變量,只能在建立他們的Shell函數或Shell腳本中使用。
 普通變量通常由開發者在開發腳本程序時建立

2.2 Shell環境變量介紹

環境變量通常是用export內置命令導出的變量,用於定義Shell的運行環境,保證Shell命令的正確執行。
Shell經過環境變量來肯定登陸用戶名、命令路徑、終端類型、登陸目錄等,全部的環境變量都是系統全局變量,可用於全部子進程中,這包括編輯器、Shell腳本和各種應用。

2.2.1 操做Shell環境變量

1.顯示環境變量
echo $PATH
 env
 set
 set -o

2.設置環境變量
 放在/etc/profile中永久並全局生效,不然只在當前shell生效
 方法一:
export JAVA_HOME=/opt/jdk
方法二:
JAVA_HOME=/opt/jdk
 export JAVA_HOME
方法三:
declare -x JAVA_HOME=/opt/jdk

3.取消環境變量
unset JAVA_HOME

2.2.2 環境變量初始化與對應文件生效

全局文件
/etc/profile
 /etc/bashrc
用戶環境變量
~/.bashrc
 ~/.bash_profile
若是以上四個文件中都定義了變量,那麼環境變量生效的優先級是怎樣的
1./etc/bashrc
 2.~/.bashrc
 3.~/.bash_profile
 4./etc/profile

由於加載順序爲下圖,後加載的先生效![](https://s1.51cto.com/images/blog/201909/04/580283343e9bf5dc54502f671e232ad4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

shell腳本

但在實際的操做中,若是把變量放在最後面,優先級並非這樣,由於
[root@m01 ~]# cat ~/.bash_profile 

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
A=2
[root@m01 ~]# cat ~/.bashrc 
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
A=3
此時輸出$A爲2,並非3,由於.bash_profile加載完了.bashrc,繼續執行了A=2,因此最終A爲2了,要把變量放在if的前面才能看到效果
要知道上面的狀況,遇到問題時纔有排查思路。。
雖然生效順序如上,可是實際工做中不要把一樣的變量寫道不少個文件中,給本身找麻煩。。給他人找麻煩。。。

2.3 普通變量介紹

普通變量也稱本地變量,本地變量在用戶當前Shell生存期的腳本中使用。
 例如,本地變量oldboy的取值爲bingbing,這個值只在用戶當前Shell生存期中有意義。
若是在Shell中啓動另外一個進程或退出,變量oldboy的值將無效。

2.3.1操做Shell普通變量

1.字符串變量
 變量名=value #<==不加引號。也會解析相應的特殊符號,可是不解析空格,若是含有空格,則不會吧相應的內容做爲一個總體
 變量名=’value’ #<==加單引號。所見即所得
 變量名=」value」 #<==加雙引號。解析特殊符號,若是含有空格,會把相應的內容做爲一個總體輸出

2.命令變量
 變量名=`ls`
變量名=$(ls)

3.變量名
 規則:字母、數字下劃線三者組合,以字母開頭
 要求:見名知意
OldboyAge=1
 oldboy_age=1
 oldboyAge=1###駝峯語法

4.變量定義總結
•針對變量名:
1)變量名的定義要有必定的命令規範,而且要見名知意,OldboyAge=1,推薦使用駝峯語法。
2)變量名僅能使用字母、數字、下劃線中的任意多個字符,而且要字母開頭。

•針對變量內容:
3)在腳本中定義普通字符串變量,儘可能把變量的內容用雙引號括起來。
4)單純數字的變量內容能夠不加引號。
5)但願變量的內容原樣輸出需加單引號。
6)但願變量值引用命令並獲取命令的結果就用反引號或$()。

•針對賦值符號:
7)變量定義使用賦值符號(=),賦值符號兩端不要有空格。

•針對變量輸出:
8)使用或者輸出變量的內容,可用$變量名,例如:echo $OldboyAge。 
9)若變量名(db)後面有其餘字符鏈接的時候,就必須給變量名加上大括號{},例如:db_t就要改爲${db}_t

2.4特殊位置參數變量

$0 獲取當前執行shell腳本的文件名,若是執行腳本帶路徑,那麼就包括腳本路徑
$n獲取當前執行的shell腳本的第n個參數,n=1..9,當n=0時表示腳本的文件名,若是n>9,須要用{}括起來,例如${10},參數用空格隔開
$#獲取當前執行的shell腳本後面接的參數個數
$* 不加""時,與$@同樣,後面的參數每一個都是獨立的,無論參數是否用雙引號括起來
    加""時,爲"$*"全部的參數都當作一個總體輸出
$@ 不加""時,與$*同樣,後面的參數每一個都是獨立的,無論參數是否用雙引號括起來
   加""時,爲"$@"每一個參數是獨立的,但若是其中有參數是用雙括號括在一塊兒的,則視爲一個參數
[root@m01 script]# vim arg.sh
#!/bin/bash
#description:test arg
#author:vita
#version:v1.0
echo '#####$0#####'
echo $0
echo '#####$n#####'
echo $2
echo '#####$*#####'
for arg in $*
do
    echo $arg
done
echo '#####$@#####'
for arg in $@
do
    echo $arg
done
echo '#####"$*"#####'
for arg in "$*"
do
    echo $arg
done
echo '#####"$@"#####'
for arg in "$@"
do
"arg.sh" 28L, 349C written                                                                 
[root@m01 script]# sh arg.sh i am "old boy"
#####$0#####
arg.sh
#####$n#####
am
#####$*#####
i
am
old
boy
#####$@#####
i
am
old
boy
#####"$*"#####
i am old boy
#####"$@"#####
i
a
old boy
[root@m01 script]#

2.5shell進程特殊狀態變量

$?獲取執行上一個指令的狀態返回值,0爲成功,非0是失敗
$$獲取當前執行的shell腳本的進程號--瞭解
$!獲取上一個後臺運行的腳本的進程號--瞭解
$_獲取在此以前執行的命令或腳本的最後一個參數--瞭解

2.6變量字串

1.${oldboy}返回變量${oldboy}的內容
[root@m01 script]# oldboy="oldoldyoungold"
[root@m01 script]# echo $oldboy
oldoldyoungold
[root@m01 script]# echo ${oldboy}
oldoldyoungold

2.${#oldboy}返回變量${oldboy}的長度
[root@m01 script]# echo ${#oldboy}
14

3.${oldboy:offset}返回變量${oldboy}從offset後開始到結尾的全部字符
[root@m01 script]# echo ${oldboy:2}
doldyoungold

4.${oldboy:offset:length}返回變量${oldboy}從offset後開始,共取length個字符串
[root@m01 script]# echo ${oldboy:2:2}
do

5.${oldboy#word}從變量${oldboy}開頭開始刪除最短匹配的word字串
[root@m01 script]# echo ${oldboy#o*o}
ldyoungold

6.${oldboy##word}從變量${oldboy}開頭開始,刪除最長匹配的word字串
[root@m01 script]# echo ${oldboy##o*o}
ld

7.${oldboy%word}從變量${oldboy}結尾開始刪除最短匹配的word字串
[root@m01 script]# echo ${oldboy%o*o}
oldoldyoungold
[root@m01 script]# echo ${oldboy%d*d}
oldol
[root@m01 script]# echo ${oldboy%%d*d}
ol

8.${oldboy%%word}從變量${oldboy}結尾開始刪除最長匹配的word字串
[root@m01 script]# echo ${oldboy%%d*d}
ol

9.${oldboy/pattern/string}使用string代替第一個匹配的pattern
[root@m01 script]# echo ${oldboy/o/O}
Oldoldyoungold

10.${oldboy//pattern/string}使用string代替全部匹配的pattern
[root@m01 script]# echo ${oldboy//o/O}
OldOldyOungOld

11.${oldboy:-word}若是oldboy變量值爲空或未賦值,就會返回word字符串替代變量的值,若是變量未定義,則返回備用的值。防止變量爲空或未定義致使異常
[root@m01 script]# result=${test:-UNSET}
[root@m01 script]# echo $result
UNSET
[root@m01 script]# echo $test
[root@m01 script]# 
企業用途:
防止path變量沒定義
[root@m01 script]# find ${path:-/tmp} -name "*.log"---path變量無值
/tmp/dracut.log
/tmp/anaconda.log
/tmp/luffycity.log
[root@m01 script]# find ${path-/tmp} -name "*.log"
/tmp/dracut.log
/tmp/anaconda.log
/tmp/luffycity.log
[root@m01 script]# 
[root@m01 script]# touch /opt/aa.log
[root@m01 script]# path=/opt   ---path變量有值
[root@m01 script]# find ${path-/tmp} -name "*.log"
/opt/aa.log
[root@m01 script]# 
/etc/init.d/httpd
HTTPD_LANG=${HTTPD_LANG-"C"} HTTPD_LANG變量不存在,就用賦值HTTPD_LANG=C
httpd=${HTTPD-/usr/sbin/httpd} HTTPD變量不存在,就賦值httpd=/usr/sbin/httpd

12.${oldboy:=word}若是oldboy變量值爲空或未賦值,就設置這個變量值爲word,並返回值。位置變量和特殊變量不適用 用途:基本同上一個${oldboy:-word},可是又額外給oldboy變量賦值了
[root@m01 script]# result1=${test1:=UNSET}
[root@m01 script]# echo $result1
UNSET
[root@m01 script]# echo $test1
UNSET
[root@m01 script]# 

13.${oldboy:?word}若是oldboy變量爲空或未賦值,word字符串將做爲標準錯誤輸出,不然輸出變量的值 用途:用於捕捉因爲變量未定義而致使的錯誤,並退出程序
[root@m01 script]# echo ${oldboyNono:+replace}

[root@m01 script]# echo ${oldboyNono:?replace}
-bash: oldboyNono: replace
[root@m01 script]# 

14.${oldboy:+word}若是oldboy變量未空或未賦值,則什麼都不作,不然word字符串替代變量的值
[root@m01 script]# resutl3=${test3:+word}
[root@m01 script]# echo $test3

[root@m01 script]# echo $result3

[root@m01 script]# test3=3
[root@m01 script]# resutl3=${test3:+word}
[root@m01 script]# echo $test3
3
[root@m01 script]# echo $resutl3
word
[root@m01 script]# 

15.輸出字符串長度的幾種方法
[root@web01 scripts]# oldboy="I am oldboy"
[root@web01 scripts]# echo ${oldboy}
I am oldboy
[root@web01 scripts]# echo ${#oldboy}
11
[root@web01 scripts]# echo $oldboy|wc -L
11
[root@web01 scripts]# expr length "$oldboy"
11
[root@web01 scripts]# echo $oldboy|awk '{print length}'
11
[root@web01 scripts]# echo $oldboy|awk '{print length ($1)}'
11
[root@web01 scripts]# echo $oldboy|awk '{print length ($0)}'
11

3.數值計算

3.1算數運算符

shell腳本

3.2運算命令

shell腳本

[root@m01 script]# declare -i a=3+4
[root@m01 script]# echo $a
 7

[root@m01 script]# a=$[3+4]
[root@m01 script]# echo $a
 7

3.2.1雙小括號"(())"數值運算的基礎語法--首推薦

((i=i+1))此中書寫方法爲運算後賦值法,即i+1的運算結果賦值給變量i。注意,不能用"echo ((i=i+1))"形式輸出表達式的值,可是能夠用echo $((i=i+1))輸出值
i=$((i+1))能夠在(())前面加$符號,將表達式運算後賦值給i
((8>7&&5==5))能夠進行比較操做,還能夠加入邏輯與和邏輯或,用於條件判斷
echo $((2+1))須要直接輸出表達式的運算結果時,能夠在(())前面加$符
[root@m01 script]# echo $((2+3))
5
[root@m01 script]# i=$((2+3))
[root@m01 script]# echo $i
5
[root@m01 script]# echo $((8>7&&5==5))
1
[root@m01 script]# a=3
[root@m01 script]# echo $(($a+3))
6
[root@m01 script]#

3.2.2let運算命令--次推薦

[root@m01 script]# a=3
[root@m01 script]# a=a+2
[root@m01 script]# echo $a
a+2
[root@m01 script]# a=3
[root@m01 script]# let a=$a+3
[root@m01 script]# echo $a
6

3.2.3expr

1.1.用於計算
運算符及用於計算的數字左右都至少有一個空格,不然報錯
使用*號時,必須用反斜線屏蔽其特殊含義。由於shell可能會誤解*的含義
[root@m01 script]# expr 2 + 2
4
[root@m01 script]# expr 2 \* 2--->*號要用\*轉義
4
[root@m01 script]# expr 2 / 2
1

1.2.判斷一個變量值是不是整數
利用expr作計算時必須是整數的規則,吧一個變量或字符串和一個已知的整數(非0)相加,看命令返回值是否爲0,若是爲0,就認爲作加法的變量是整數,不然就不是整數
[root@m01 script]# i=5  賦值一個數5給i
[root@m01 script]# expr $i + 6 &>/dev/null  把i和整數相加,&>/dev/null表示不保留任何輸出
[root@m01 script]# echo $?  輸出返回值
0  返回值爲0,說明是整數
[root@m01 script]# i=value
[root@m01 script]# expr $i + 6 &>/dev/null
[root@m01 script]# echo $?
2  返回值不爲0,說明不是整數
[root@m01 script]# 

1.3.判斷文件擴展名是否符合要求
[root@m01 script]# vim extendName.sh
#!/bin/bash
#description:identify the extend name of one file
#author:vita
#version:v1.0
if expr "$1" : .*\.pub &>/dev/null
  then
    echo "you are using $1"
else
  echo "pls use *.pub file"
fi
[root@m01 script]# sh extendName.sh ew.pub
you are using ew.pub
[root@m01 script]# sh extendName.sh ew.txt
pls use *.pub file
[root@m01 script]# 

1.4.計算字符串的長度
[root@m01 script]# a="i am a good colleage"
[root@m01 script]# expr length $a
expr: syntax error
[root@m01 script]# expr length "$a"
20

3.2.4適合小數的運算命令bc

[root@m01 script]# echo 3+5|bc
8
[root@m01 script]# echo 3.1+3.2|bc
6.3
[root@m01 script]# echo "scale=2;3.11+3.22"|bc
6.33
[root@m01 script]# echo "scale=2;3.113+3.22"|bc
6.333
[root@m01 script]# echo "scale=2;3.113+3.221"|bc
6.334
[root@m01 script]# echo "scale=4;3.113+3.221"|bc
6.334
[root@m01 script]# echo "scale=1;3.113+3.221"|bc
6.334
[root@m01 script]# echo "scale=1;3.113/3.221"|bc
.9
[root@m01 script]# echo "scale=1;7/3"|bc
2.3
[root@m01 script]# echo "scale=4;7/3"|bc
2.3333
[root@m01 script]#

3.2.5適合小數的運算命令awk----小數運算推薦awk

[root@m01 script]# echo "2.33 3.4"|awk '{print $1+$2}'
5.73
[root@m01 script]# echo "2.33 3.4"|awk '{print $1/$2}'
0.685294
[root@m01 script]# echo "2.33 3.4"|awk '{print $1/$2*10}'
6.85294
[root@m01 script]#

4.read

shell變量除了能夠直接賦值或腳本傳參外,還能夠用read命令從標準輸入中得到,read爲bash內置命令,
-p設置提示信息
-t設置輸入等待的時間,單位默認爲秒
 操做案例:
 測試命令
[root@m01 script]# b="w e"
[root@m01 script]# echo "$b"|sed -r 's# ##g'|wc -L
2
[root@m01 script]# echo "$b"|wc -L
3
[root@m01 script]# b=""
[root@m01 script]# echo "$b"|wc -L
0
[root@m01 script]# echo "$b"|sed -r 's# ##g'|wc -L
0
[root@m01 script]# 
腳本內容
[root@m01 script]# cat cmpVar.sh 
#!/bin/bash
#description:compare to variable
#author:vita
#version:v1.0
read -p "please input two number:"  a b
#判斷是否輸入了第一個參數
if [ -z $a ];then
    echo "you must input first number"
    exit 6
fi
#當用戶輸入三個參數的時候,第一個空格後的內容都當作第二個參數,因爲第二個參數中是含有空格的,能夠去除空格比較長度
if [ $(echo "$b"|sed -r 's# ##g'|wc -L) -eq $(echo "$b"|wc -L) ];then
####不輸入第二個參數的時候,長度也是相同的,因此要對此狀況作判斷
    if [ -z $b ];then
        echo "you must input second number"
        exit 8
    fi
#長度不相同,說明輸入了多個參數
elif [ $(echo "$b"|sed -r 's# ##g'|wc -L) -ne $(echo "$b"|wc -L) ];then
    echo "you can just input two number"
    exit 9
fi
##判斷輸入是不是整數
expr $a + $b + 2 &>/dev/null
if [ $? -ne 0 ];then
    echo "the two number must be int"
    exit 1
fi
#用戶輸入終於合法了,能夠判斷大小了
if [ $a -gt $b ];then
    echo "$a>$b"
    exit 3
elif [ $a -eq $b ];then
    echo "$a==$b"
    exit 4
elif [ $a -lt $b ];then
    echo "$a<$b"
    exit 5
fi
[root@m01 script]# 
測試腳本
[root@m01 script]# sh cmpVar.sh 
please input two number:
you must input first number
[root@m01 script]# sh cmpVar.sh 
please input two number:2
you must input second number
[root@m01 script]# sh cmpVar.sh 
please input two number:2 3 4
you can just input two number
[root@m01 script]# sh cmpVar.sh 
please input two number:2 a
the two number must be int
[root@m01 script]# sh cmpVar.sh 
please input two number:w 3
the two number must be int
[root@m01 script]# sh cmpVar.sh 
please input two number:2 3
2<3
[root@m01 script]# sh cmpVar.sh 
please input two number:23 3
23>3
[root@m01 script]# sh cmpVar.sh 
please input two number:23 23
23==23

5.條件測試與比較

5.1測試表達式語法

條件表達式6種寫法:if,while
語法1: test <測試表達式>
語法2: [ <測試表達式> ]    #兩端有空格
語法3:[[ <測試表達式> ]]  #兩端有空格
語法4:((<測試表達式>))    #不須要空格

語法5:(命令表達式) 
語法6:`命令表達式`
編程語法:
[ <測試表達式> ] && 命令1
若是前面表達式成功,那麼就執行後面命令。

[ <測試表達式> ] || 命令1
若是前面表達式失敗,那麼就執行後面命令。

[ <測試表達式> ] && {
命令1
命令2
命令3
}
若是前面表達式成功,那麼就執行後面命令。

[ <測試表達式> ] && 命令1 || 命令2
若是前面表達式成功,那麼就執行命令1,不然執行命令2。

[ <測試表達式> ] && {
命令1
命令2
}||{
命令3
命令4
}
若是前面表達式成功,那麼就執行命令1,2,不然執行命令3,4。

5.2文件測試表達式

shell腳本

爲何須要文件測試表達式?
 操做一個對象,就要看對象條件是否知足,不然不要操做。
一、常見功能
二、實踐
三、企業應用:啓動腳本中的應用。

5.3字符串測試表達式

shell腳本

注意:
一、字符串就用雙引號
二、等號能夠用一個或者兩個。
三、=號兩端必需要有空格。
 實踐:

[root@web01 ~]# [ -n "oldboy" ] && echo 1 || echo 0
1
[root@web01 ~]# [ -z "oldboy" ] && echo 1 || echo 0
0
[root@web01 ~]# char="oldboy"
[root@web01 ~]# [ -z "$char" ] && echo 1 || echo 0
0
[root@web01 ~]# unset char
[root@web01 ~]# [ -z "$char" ] && echo 1 || echo 0
1
[root@web01 ~]# [ "dd" == "dd" ] && echo 1 || echo 0
1
[root@web01 ~]# [ "dd" == "ff" ] && echo 1 || echo 0
0
[root@web01 ~]# [ "dd" = "ff" ] && echo 1 || echo 0
0
[root@web01 ~]# [ "dd" != "ff" ] && echo 1 || echo 0
1
[root@web01 ~]# [ "dd" != "dd" ] && echo 1 || echo 0
0

5.4整數測試表達式

shell腳本

5.5邏輯測試表達式

shell腳本

5.6條件測試表達式語法對比

shell腳本

[root@db03 scripts]# [ 1 -eq 1 -a -f /etc/hosts ] && echo 1 || echo 0
1
[root@db03 scripts]# [ 1 -eq 2 -a -f /etc/hosts ] && echo 1 || echo 0
0
[root@db03 scripts]# [ 1 -eq 2 && -f /etc/hosts ] && echo 1 || echo 0
-bash: [: missing `]'
0
[root@db03 scripts]# [[ 1 -eq 2 && -f /etc/hosts ]] && echo 1 || echo 0
0

[root@db03 scripts]# [ 1 -eq 2 ] && [ -f /etc/hosts ] && echo 1 || echo 0

[root@db03 scripts]# [ -f /etc/hosts ] && echo 1 || echo 0
1
[root@db03 scripts]# [ ! -f /etc/hosts ] && echo 1 || echo 0
0
小題:若是/tmp/oldboy.sh是普通文件,而且可執行,就執行改腳本。
file="/tmp/oldboy.sh"
if [ -f $file ] && [ -x $file ]
then
    bash $file
fi

6.if

shell腳本
shell腳本

7.函數

shell腳本
shell腳本
shell腳本

企業案例:經過腳本傳參的方式,檢查Web 網站URL是否正常。
wget命令:
--spider 模擬爬蟲,不真正下載
-q 安靜訪問
-o /dev/null 不輸出
-T --timeout 超時時間
-t --tries 重試次數
[root@web01 ~]# wget --spider -T 5 -q -o /dev/null -t 2 www.baidu.com
[root@web01 ~]# echo $?
0

curl命令:
-I 看響應頭
-s 安靜的
-o /dev/null 不輸出
-w %{http_code} 返回狀態碼,200
[root@web01 ~]# curl www.baidu.com -s &>/dev/null
[root@web01 ~]# echo $?
0
[root@web01 ~]# curl -I -m 5 -s -w "%{http_code}\n" -o /dev/null  www.baidu.com
200

[root@oldboy ~]# cat checkurl.sh 
#!/bin/bash
##############################################################
# File Name: checkurl.sh
# Version: V1.0
# Author: vita
# Organization: vita
# Created Time : 2019-06-07 18:29:19
# Description:
##############################################################
usage(){
    echo "Usage:$0 url"
    exit 1
}
checkurl(){
    wget -q -o /dev/null -t 2 -T 5 $1
    if [ $? -eq 0 ]
    then
        echo "$1 is ok"
    else
        echo "$1 is fail"
    fi
}
main(){
    if [ $# -ne 1 ]
    then
        usage
    fi
    checkurl $1
}
main $*

[root@oldboy scripts]# cat 8_5_1.sh   
#!/bin/sh
function usage() {     #<==幫助函數
    echo $"usage:$0 url"
    exit 1
}

function check_url() { #<==檢測URL函數。
  wget --spider -q -o /dev/null --tries=1 -T 5 $1 #<==這裏的$1就是函數傳參。
  if [ $? -eq 0 ]
   then
     echo "$1 is yes."
  else
    echo "$1 is no."
  fi
}

function main() {   #<==主函數。
  if [ $# -ne 1 ]  #<==若是傳入的多個參數,則打印幫助函數,提示用戶。
  then
    usage
  fi
  check_url $1     #<==接收函數的傳參,即把結尾的$*傳到這裏。
}
main $*            #<==這裏的$*就是把命令行接收的全部參數做爲函數參數傳給函數內部,經常使用手法。

8.設置輸出字體顏色

範例9_3:給內容加不一樣的顏色。
 內容的顏色用數字表示,範圍爲30-37,每一個數字表明一種顏色。代碼以下:
echo -e "\033[30m 黑色字oldboy trainning \033[0m" #<==30m表示黑色字。
echo -e "\033[31m 紅色字oldboy trainning \033[0m" #<==31m表示紅色字。
echo -e "\033[32m 綠色字oldboy trainning \033[0m" #<==32m表示綠色字。
echo -e "\033[33m 棕色字oldboy trainning \033[0m" #<==33m表示棕色字(brown),和黃色字相近。
echo -e "\033[34m 藍色字oldboy trainning \033[0m" #<==34m表示藍色字。
echo -e "\033[35m 洋紅字oldboy trainning \033[0m" #<==35m表示洋紅色字(magenta),和紫色字相近。
echo -e "\033[36m 藍綠色oldboy trainning \033[0m" #<==36m表示藍綠色字(cyan),和淺藍色字相近。
echo -e "\033[37m 白色字oldboy trainning \033[0m" #<==37m表示白色字。
 說明:不一樣的數字對應的字體顏色,見系統幫助(來源man console_codes命令的結果)。
 範例9_6: 給輸出的字符串加不一樣的背景顏色。
 字的背景顏色對應的數字範圍爲40-47,代碼以下。
echo -e "\033[40;37m 黑底白字oldboy\033[0m" #<==40m表示黑色背景。
echo -e "\033[41;37m 紅底白字oldboy\033[0m" #<==41m表示紅色背景。
echo -e "\033[42;37m 綠底白字oldboy\033[0m" #<==42m表示綠色背景。
echo -e "\033[43;37m 棕底白字oldboy\033[0m" #<==43m表示棕色背景(brown),和黃色背景相近。
echo -e "\033[44;37m 藍底白字oldboy\033[0m" #<==44m表示藍色背景。
echo -e "\033[45;37m 洋紅底白字oldboy\033[0m" #<==45m表示洋紅色背景(magenta),和紫色背景相近。
echo -e "\033[46;37m藍綠底白字oldboy\033[0m" #<==46m表示藍綠色背景(cyan),和淺藍色背景相近。
echo -e "\033[47;30m 白底黑字oldboy\033[0m" #<==47m表示白色背景。

9.while

shell腳本
shell腳本

kill、killall、pkill:殺掉進程。
ps:查看進程。
pstree:顯示進程狀態樹。
top:顯示進程。
renice:改變優先權。
nohup:用戶退出系統以後繼續工做。
pgrep:查找匹配條件的進程。
strace:跟蹤一個進程的系統調用狀況。
ltrace:跟蹤進程調用庫函數的狀況。
讀文件
•方式1:在while循環結尾done經過輸入重定向指定讀取的文件。
while read line
do
    cmd
done<FILE

•方式2:使用cat讀取文件內容,而後經過管道進入while循環處理。
cat FILE_PATH|while read line
do
    cmd
done

•方式3:採用exec讀取文件後,而後進入while循環處理。
exec <FILE
sum=0
while read line
do
    cmd
done

10.for循環

shell腳本

11. break、continue、exit、return的區別和對比

shell腳本

12.數組

12.1數組定義

•方法1:用小括號將變量值括起來賦值給數組變量,每一個變量值之間要用空格分隔。
語法以下:
array=(value1 value2 value3 ... ) 
此爲經常使用定義方法,需重點掌握。
示例以下:
[root@oldboy ~]# array=(1 2 3)    #<==用小括號將數組內容賦值給數組變量,數組元素用「空格」分隔開。
[root@oldboy ~]# echo ${array[*]} #<==輸出上面定義的數組的全部元素值,注意語法。
1 2 3

•方法2:用小括號將變量值括起來,同時採用鍵值對的形式賦值。
語法以下:
array=([1]=one [2]=two [3]=three) 
此種方法爲key-value鍵值對的形式,小括號裏對應的數字爲數組下標,等號後面的內容爲下標對應的數組變量的值,此方法比較複雜,不推薦使用。
示例以下:
[root@oldboy ~]# array=([1]=one [2]=two [3]=three)
[root@oldboy ~]# echo ${array[*]} #<==輸出上面定義的數組的全部元素值。 
one two three
[root@oldboy ~]# echo ${array[1]} #<==輸出上面定義的數組的第一個元素值。
one
[root@oldboy ~]# echo ${array[2]} #<==輸出上面定義的數組的第二個元素值。
two
[root@oldboy ~]# echo ${array[3]} #<==輸出上面定義的數組的第三個元素值。
three

•方法3:經過分別定義數組變量的方法來定義。
語法以下:
array[0]=a;array[1]=b;array[2]=c
此種定義方法比較麻煩,不推薦使用。
示例以下:
[root@oldboy ~]# array[0]=a
[root@oldboy ~]# array[1]=b
[root@oldboy ~]# array[2]=c
[root@oldboy ~]# echo ${array[0]}
a

•方法4:動態地定義數組變量,並使用命令的輸出結果做爲數組的內容。
語法爲:
array=($(命令))
或
array=(`命令`)
示例以下:
[root@oldboy data]# mkdir /array/ -p
[root@oldboy data]# touch /array/{1..3}.txt
[root@oldboy data]# ls -l /array/
總用量 0
-rw-r--r-- 1 root root 0 9月   6 09:38 1.txt
-rw-r--r-- 1 root root 0 9月   6 09:38 2.txt
-rw-r--r-- 1 root root 0 9月   6 09:38 3.txt
[root@oldboy data]# array=($(ls /array))
[root@oldboy data]# echo ${array[*]}
1.txt 2.txt 3.txt
說明:還可使用declare -a array來定義數組類型,可是比較少這樣用。

12.2操做數組元素

1.打印數組元素
此爲經常使用知識點,需重點掌握。示例以下:
[root@oldboy data]# array=(one two three)
[root@oldboy data]# echo ${array[0]}
#<==打印單個數組元素用${數組名[下標]},當未指定數組下標時,數組的下標是從0開始。
one
[root@oldboy data]# echo ${array[1]}
two
[root@oldboy data]# echo ${array[2]}
three
[root@oldboy data]# echo ${array[*]}   #<==使用*或者@能夠獲得整個數組內容。
one two three
[root@oldboy data]# echo ${array[@]}   #<==使用*或者@能夠獲得整個數組內容。
one two three

2.打印數組元素的個數
此爲經常使用知識點,需重點掌握。示例以下:
[root@oldboy data]# echo ${array[*]}   #<==使用*或者@能夠獲得整個數組內容。
one two three
[root@oldboy data]# echo ${#array[*]}  #<==用${#數組名[@或*]}能夠獲得數組長度,這和前文講解的變量子串知識是同樣的,由於數組也是變量,只不過是特殊的變量,所以也適合變量的子串替換等知識。
3
[root@oldboy data]# echo ${array[@]}   #<==使用*或者@能夠獲得整個數組內容。
one two three
[root@oldboy data]# echo ${#array[@]}  #<==用${#數組名[@或*]}能夠獲得數組長度,這和前文講解的變量子串知識是同樣的,由於數組也是變量,只不過是特殊的變量,所以也適合變量的子串替換等知識。
3

3.數組賦值
此知識不經常使用,瞭解便可。可直接經過「數組名[下標] 」對數組進行引用賦值,若是下標不存在,自動添加新一個數組元素,若是下標存在就覆蓋原來的值。
示例以下:
[root@oldboy data]# array=(one two three)
[root@oldboy data]# echo ${array[*]}
one two three
[root@oldboy data]# array[3]=four       #<==增長下標爲3的數組元素。
[root@oldboy data]# echo ${array[*]}
one two three four
[root@oldboy data]# array[0]=oldboy
[root@oldboy data]# echo ${array[*]}
oldboy two three four
[root@oldboy ~]# array[0]=oldboy        #<==修改數組元素。
[root@oldboy ~]# echo ${array[@]}
oldboy 2 3 4

4.數組的刪除
由於數組本質上仍是變量,所以可經過「unset 數組[下標]」清除相應的數組元素,若是不帶下標,表示清除整個數組的全部數據。
示例以下:
[root@oldboy data]# echo ${array[*]}
oldboy two three four
[root@oldboy data]# unset array[1]   #<==取消下標爲1的數組元素。
[root@oldboy data]# echo ${array[*]} #<==打印輸出後發現數組元素「two」,不見了。
oldboy three four
[root@oldboy data]# unset array      #<==刪除整個數組。
[root@oldboy data]# echo ${array[*]}
#<==沒有任何內容了。

5.數組內容的截取和替換
這裏和前文變量子串的替換是同樣的,由於數組是特殊的變量。數組元素部份內容截取的示例以下:
[root@oldboy ~]# array=(1 2 3 4 5)
[root@oldboy ~]# echo ${array[@]:1:3}          #<==從下標爲1的元素開始截取,共取3個數組元素。
2 3 4
[root@oldboy data]# array=({a..z})             #<==將變量的結果賦值給數組變量。
[root@oldboy data]# echo ${array[@]}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@oldboy data]# echo ${array[@]:1:3}       #<==從下標爲1的元素開始截取,共取3個數組元素。
b c d
[root@oldboy data]# echo ${array[@]:0:2}       #<==從下標爲0的元素開始截取,共取2個數組元素。
a b
數組元素部份內容的替換以下:
[root@oldboy data]# array=(1 2 3 1 1)   
[root@oldboy data]# echo ${array[@]/1/b}    #<==把數組中的1替換成b,原數組未被修改,和sed很像。
b 2 3 b b
提示:調用方法是:${數組名[@或*]/查找字符/替換字符} 該操做不會改變原先數組內容,若是須要修改,能夠看上面例子,從新定義數組。
數組元素部份內容的刪除以下:
[root@oldboy data]# array=(one two three four five)
[root@oldboy data]# echo ${array[@]}               
one two three four five
[root@oldboy data]# echo ${array[@]#o*}    #<==從左邊開始匹配最短的,並刪除。 
ne two three four five
[root@oldboy data]# echo ${array1[@]##o*}  #<==從左邊開始匹配最長的,並刪除。 
two three four five
[root@oldboy data]# echo ${array[@]%f*}    #<==從右邊開始匹配最短的,並刪除。 
one two three
[root@oldboy data]# echo ${array[@]%%f*}   #<==從右邊開始匹配最長的,並刪除。
one two three
提示:數組也是變量,所以也適合於前面講解過的變量的子串處理的功能應用。
數組的其餘相關知識經過man bash而後搜Arrays來了解。

13.案例

13.1使用for循環在/oldboy目錄下批量建立10個html文件,其中每一個文件須要包含10個隨機小寫字母加固定字符串oldboy,建立的結果名稱案例以下

產生隨機數的幾種方法
方法一

[root@m01 ~]# echo $RANDOM
 6283
範圍是0-32767
方法二

[root@m01 ~]# openssl rand -base64 10
 YWUxX2qeGpYxTw==

[root@m01 ~]# openssl rand -base64 5
 5TFO28c=

[root@m01 ~]#
方法三

[root@m01 ~]# date +%s%N
 1554090050912930903
方法四

[root@m01 ~]# head /dev/urandom |cksum
 1387668414 1488
方法五

[root@m01 ~]# uuidgen
 acabc769-db56-4cf8-bfe2-df1fc3d66f69
方法六

[root@m01 ~]# cat /proc/sys/kernel/random/uuid
 44a2ba9c-0571-4723-8edc-3269bb433374
方法七
yum install -y expect

[root@m01 ~]# mkpasswd -l 11 -d 3 -C 3 -c 4
 wC304AbqCh>
-l長度
-d數字
-c小寫字母
-C大寫字母
-s特殊字符

[root@m01 ~]# echo "oldboy$RANDOM" |md5sum|tr '[0-9]' '[a-z]'|cut -c 2-11
 haiejeaaie

腳本內容
[root@m01 script]# cat 1.randomFileName.sh 
#!/bin/bash
##############################################################
# File Name: 1.randomFileName.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:18:13
# Description:
##############################################################
randomDir=/opt/randomFile
[ -d $randomDir ]||mkdir -p $randomDir
for ((i=0;i<10;i++));do
    lowerName=$(echo "oldboy$RANDOM" |md5sum|tr '[0-9]' '[a-z]'|cut -c 2-11)
    cd $randomDir
    touch ${lowerName}_oldboy.html
    echo "${lowerName}_oldboy.html has been touched!"
done
[root@m01 script]# ll /opt/randomFile/
total 0
-rw-r--r-- 1 root root 0 Apr  1 13:27 acaefhebdj_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 aijcddcebg_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 bhjdeifjcd_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 dfjgfccffe_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 diffjdacah_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 ehdfacbjdf_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 ghdhjbbgbe_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 iabafbcahh_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 jdidcffgeb_oldboy.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 jhddaibhhd_oldboy.html

13.2批量更名,吧上面文件名中的oldboy改成oldgirl

[root@m01 script]# cat 2.rename.sh 
#!/bin/bash
##############################################################
# File Name: 2.rename.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:31:50
# Description:
##############################################################
randomDir=/opt/randomFile
files=$(ls $randomDir)
cd $randomDir
for file in $files;do
    newName=$(echo $file |sed 's#oldboy#oldgirl#g')
    mv $file $newName
    echo "$file change name to $newName!"
done
[root@m01 script]# sh 2.rename.sh 
acaefhebdj_oldgirl.html change name to acaefhebdj_oldgirl.html!
acgfcjcaaf_oldboy.html change name to acgfcjcaaf_oldgirl.html!
adefgffbfg_oldboy.html change name to adefgffbfg_oldgirl.html!
beabcafcdb_oldboy.html change name to beabcafcdb_oldgirl.html!
cebieaiadf_oldboy.html change name to cebieaiadf_oldgirl.html!
fbbdegebba_oldboy.html change name to fbbdegebba_oldgirl.html!
gcjafhcbbc_oldboy.html change name to gcjafhcbbc_oldgirl.html!
gibbcddcha_oldboy.html change name to gibbcddcha_oldgirl.html!
gjdebcjeba_oldboy.html change name to gjdebcjeba_oldgirl.html!
jdbifebcgj_oldboy.html change name to jdbifebcgj_oldgirl.html!

[root@m01 script]# ls -l /opt/randomFile/
total 0
-rw-r--r-- 1 root root 0 Apr  1 13:38 abbdcejieb_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:27 acaefhebdj_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 acgfcjcaaf_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 adefgffbfg_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 beabcafcdb_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 cebieaiadf_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 fbbdegebba_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 gcjafhcbbc_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 gibbcddcha_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 gjdebcjeba_oldgirl.html
-rw-r--r-- 1 root root 0 Apr  1 13:38 jdbifebcgj_oldgirl.html

13.3批量添加用戶oldboy01-oldboy10,並設置隨機密碼

版本一:
[root@m01 script]# cat 3.useradd.sh 
#!/bin/bash
##############################################################
# File Name: 3.useradd.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:41:32
# Description:
##############################################################
for i in {01..10};do
    passwd=$(mkpasswd -l 15 -d 2 -c 3)
    username=oldboy$i
    useradd $username
    echo "$passwd"|passwd --stdin $username
    echo "$username---$passwd">>./log/passwd.log
done
[root@m01 script]# 
[root@m01 script]# sh 3.useradd.sh
Changing password for user oldboy01.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy02.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy03.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy04.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy05.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy06.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy07.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy08.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy09.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy10.
passwd: all authentication tokens updated successfully.
[root@m01 script]# cat log/passwd.log 

oldboy01---vdloEpid47nXvp\
oldboy02---dgs0Qb@Cvw3onhf
oldboy03---ege7dabv=Lkz3jP
oldboy04---8grNTrbqdzct?1x
oldboy05---qYQlor-va2llhp1
oldboy06---Dkrfbbbukx&Uf90
oldboy07---"cKz6Fs9vbdihgx
oldboy08---az<r1hdWUvbbw2t
oldboy09---dkdypnDu(8obzU6
oldboy10---^sAthaqc74pVadn

版本二:
[root@m01 script]# cat 3-1.useradd.sh 
#!/bin/bash
##############################################################
# File Name: 3-1.useradd.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:54:21
# Description:
##############################################################
for i in $(seq -w 11 15);do
    pass=$(openssl rand -base64 10)
    useradd oldboy$i
    echo "oldboy$i:$pass">>./log/chpasswd.log
done
chpasswd <./log/chpasswd.log

[root@m01 script]# cat ./log/chpasswd.log 
oldboy11:Zrg/jho7XuCgQw==
oldboy12:1ISH686XhMEmLQ==
oldboy13:b+3QK+0wQTiJtQ==
oldboy14:KVVRytEJHWV/Tg==
oldboy15:WFQlIbMIjeYAMQ==

完美版
[root@m01 script]# cat 3.useradd.sh 
#!/bin/bash
##############################################################
# File Name: 3.useradd.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 13:41:32
# Description:
##############################################################
source /etc/init.d/functions
if [ $UID -ne 0];then
    echo "you can only use root to add new user!"
    exit 1
fi
for i in {12..17};do
    username=oldboy$i
    if [ $(grep $username /etc/passwd|wc -l) -eq 1 ];then
        action "oldboy$i has already exist!" /bin/false
    else
        useradd $username
        passwd=$(mkpasswd -l 15 -d 2 -c 3)
        echo "$passwd"|passwd --stdin $username
        echo "$username---$passwd">>./log/passwd.log
        action "$username has been added succesfully!" /bin/true
    fi
done
[root@m01 script]# 
[root@m01 script]# sh 3.useradd.sh 
3.useradd.sh: line 11: [: missing `]'
oldboy12 has already exist!                                [FAILED]
oldboy13 has already exist!                                [FAILED]
oldboy14 has already exist!                                [FAILED]
oldboy15 has already exist!                                [FAILED]
Changing password for user oldboy16.
passwd: all authentication tokens updated successfully.
oldboy16 has been added succesfully!                       [  OK  ]
Changing password for user oldboy17.
passwd: all authentication tokens updated successfully.
oldboy17 has been added succesfully!                       [  OK  ]

13.4掃描網絡內存活的主機

方法一:

[root@m01 script]# nmap -sP 10.0.0.0/24

Starting Nmap 5.51 ( http://nmap.org ) at 2019-04-01 14:22 CST
 Nmap scan report for 10.0.0.1
 Host is up (0.00042s latency).
 MAC Address: 00:50:56:C0:00:08 (VMware)
 Nmap scan report for 10.0.0.61
 Host is up.
 Nmap scan report for 10.0.0.254
 Host is up (0.00014s latency).
 MAC Address: 00:50:56:E2:B0:A8 (VMware)
 Nmap done: 256 IP addresses (3 hosts up) scanned in 19.46 seconds
方法二:

[root@m01 script]# ping -c 1 -t 2 www.baidu.com2
 ping: unknown host www.baidu.com2

[root@m01 script]# echo $?
 2

[root@m01 script]# cat 4.ping.sh 
#!/bin/bash
##############################################################
# File Name: 4.ping.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 14:33:53
# Description:
##############################################################
source /etc/init.d/functions
for ip in {1..254};do
{
    ping -c 1 -w 3 10.0.0.$ip > /dev/null 2>&1
    [ $? -eq 0 ]&&{
    action "10.0.0.$ip can be accessed!" /bin/true
    }||{
    action "10.0.0.$ip can not be accessed" /bin/false
    }
} & -----這裏用{} &意思是併發執行裏面的內容,不過輸出有些混亂。相比之下,順序執行比較慢
done

13.5分庫備份

常規方法:
mysqldump -B oldboy oldgirl test|gzip>bak.sql.gz
分庫備份
mysqldump -B oldboy|gzip>bak.sql.gz
 mysqldump -B oldgirl|gzip>bak.sql.gz
 mysqldump -B test|gzip>bak.sql.gz

[root@m01 script]# vim 5.mysqlDatabase.sh
#!/bin/bash
##############################################################
# File Name: 5.mysqlDatabase.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 15:11:51
# Description:
##############################################################

mysqlCommand=/application/mysql/bin/mysql
mysqlDump=/application/mysql/bin/mysqldump
databases=$($mysqlCommand -uroot -poldboy123 -e "show databases" 2>/dev/null |grep -Ev 'Database|schema')
for database in $databases;do
    $mysqlDump -uroot -poldboy123 -B $database|gzip>${database}.sql.gz                                       
done

13.6分庫分表

[root@m01 script]# cat 6.mysqlTable.sh 
#!/bin/bash
##############################################################
# File Name: 6.mysqlTable.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 15:39:12
# Description:
##############################################################
mysqlCommand="/application/mysql/bin/mysql  -uroot -poldboy123"
mysqlDump="/application/mysql/bin/mysqldump  -uroot -poldboy123"
databases=$($mysqlCommand  -e "show databases;" 2>/dev/null |grep -Ev 'Database|schema')
for database in $databases;do
    for table in $($mysqlCommand -e "show tables from $database;" 2>/dev/null|sed 1d );do

        $mysqlDump  -B $database $table |gzip>./log/${database}_${table}.sql.gz 2>/dev/null
    done
done

13.7SSH免祕鑰批量分分發文件

[root@m01 script]# cat 7.distributeFile.sh 
#!/bin/bash
##############################################################
# File Name: 7.distributeFile.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 15:57:04
# Description:
##############################################################
source /etc/init.d/functions
[ $# -ne 2 ]&&{
echo "Usage $0 localpath remotepath"
exit 1
}
for ip in 7;do
    scp -r $1 root@10.0.0.$ip:$2
    [ $? -eq 0 ]&&{
    action "10.0.0.$ip has recevied file" /bin/true
    }||{
    action "10.0.0.$ip has not received file" /bin/false
    }
done
[root@m01 script]# 
[root@m01 script]# sh 7.distributeFile.sh /oldboy/ /ol
10.0.0.7 has recevied file                                 [  OK  ]
[root@m01 script]# sh 7.distributeFile.sh /oldb /ol
/oldb: No such file or directory
10.0.0.7 has not received file                             [FAILED]

13.8破解RAND

這個是最快的,由於循環少了不少
[root@m01 script]# cat 8-2.encodeRandom.sh 
#!/bin/bash
##############################################################
# File Name: 8.encodeRandom.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 16:08:14
# Description:
##############################################################
array=(21029299 00205d1c a3da1677 1f6d12dd 890684b)

for i in {1..32767};do
    echo "$i $(echo "$i"|md5sum)">>log/encode.log
done

for md5Num in ${array[*]};do
    echo "$(grep "$md5Num" log/encode.log)"
done
[root@m01 script]# 
[root@m01 script]# sh 8-2.encodeRandom.sh 
25667 2102929901ee1aa769d0f479d7d78b05  -
1346 00205d1cbbeb97738ad5bbdde2a6793d  -
25345 a3da1677501d9e4700ed867c5f33538a  -
7041 1f6d12dd61b5c7523f038a7b966413d9  -
10082 890684ba3685395c782547daf296935f  -

不用數組
[root@m01 script]# cat 8.encodeRandom.sh 
#!/bin/bash
##############################################################
# File Name: 8.encodeRandom.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 16:08:14
# Description:
##############################################################
for i in {1..32767};do
    for md5Num in 21029299 00205d1c a3da1677 1f6d12dd 890684b;do
       num=$(echo "$i"|md5sum|grep "$md5Num"|wc -l)
       if [ $num -eq 0 ];then
           continue
       else
           echo "${i}----${md5Num}"
           continue
       fi
    done
done
使用數組
[root@m01 script]# cat 8-1.encodeRandom.sh 
#!/bin/bash
##############################################################
# File Name: 8.encodeRandom.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 16:08:14
# Description:
##############################################################
array=(21029299 00205d1c a3da1677 1f6d12dd 890684b)
for i in {1..32767};do
    for md5Num in ${array[*]};do
       num=$(echo "$i"|md5sum|grep "$md5Num"|wc -l)
       if [ $num -eq 0 ];then
           continue
       else
           echo "${i}----${md5Num}"
           continue
       fi
    done
done
[root@m01 script]# 
[root@m01 script]# sh 8-1.encodeRandom.sh 
1346----00205d1c
7041----1f6d12dd
10082----890684b
25345----a3da1677
25667----21029299

13.9監測url

[root@m01 script]# cat 9.checkUrl.sh 
#!/bin/bash
##############################################################
# File Name: 9.checkUrl.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 17:12:15
# Description:
##############################################################
source /etc/init.d/functions
url_list=(
http://blog.oldboyedu.com
http://blog.etiantian.org
http://oldboy.blog.51cto.com
http://10.0.0.7
)
checkUrl() {
    curl -s -t 3 -o /dev/null $1
    [ $? -eq 0 ]&&{
        action "$1 can be accessed!" /bin/true
    }||{
        action "$1 can not be accessed!" /bin/false
    }

}
dealUrl() {
    for url in ${url_list[*]};do
        checkUrl $url
    done
}
main() {
    dealUrl
}
main
[root@m01 script]# 
[root@m01 script]# sh 9.checkUrl.sh 
http://blog.oldboyedu.com can be accessed!                 [  OK  ]
http://blog.etiantian.org can not be accessed!             [FAILED]
http://oldboy.blog.51cto.com can be accessed!              [  OK  ]
http://10.0.0.7 can not be accessed!                       [FAILED]

13.10防止DOS

[root@m01 oldboy]# cat access_2010-12-8.log |awk -F '[ ]' '{IP[$1]++}END{for (key in IP) print key,IP[key]}'
59.33.26.105 44
123.122.65.226 31
124.115.4.18 40

[root@m01 script]# cat 10-Dos.sh 
#!/bin/bash
##############################################################
# File Name: 10-Dos.sh
# Version: V1.0
# Author: vita
# Organization: 
# Created Time : 2019-04-01 17:58:54
# Description:
##############################################################
awk '{IP[$1]++}END{for (key in IP) print key,IP[key]}' ./log/access_2010-12-8.log>./log/dosResult.log
exec < ./log/dosResult.log
while read line;do
    times=$(echo "$line"|awk '{print $2}')
    ip=$(echo "$line"|awk '{print $1}')
    if [ $times -gt 10 ];then
        iptables -A INPUT -s $ip -j DROP
    fi
done
[root@m01 script]#

13.11按單詞排序

[root@m01 log]# awk -F "[ .,]" '{for (i=1;i<NF;i++)array[$i]++}END{for (word in array)print array[word],word}' 12.log |sort -rn
2 the
2 support
2 squid
2 and
1 users
1 training
1 to
1 sections
1 resources
1 provides

方法二:
[root@m01 log]# tr " |,|." "\n" <12.log |awk '{array[$1]++}END{for (key in array)print array[key],key}'|sort -rn
2 the
2 support
2 squid
2 and
2 
1 users
1 training
1 to
1 sections
1 resources
1 provides
1 project

[root@m01 log]# awk -F "" '{for (i=1;i<=NF;i++)array[$i]++}END{for (word in array)print word,array[word]}' 12.log |sort -rn|grep -Ev '^ |^,|^\.'|sort -n
a 10
b 4
c 4
d 8
e 17
f 3
g 2
h 2
i 14
j 1
l 5
m 6
n 14
o 18
P 1
p 7
q 2
r 12
s 19
t 15
u 8
v 1
w 1
y 2
[root@m01 log]# grep -o  "[a-Z]" 12.log 
t
h
e
s
q
u
i

13.12MYSQL啓動腳本

#!/bin/bash
# chkconfig: 2345 21 81
##############################################################
# File Name: mysqld
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
lockfile=/var/lock/subsys/mysqld
. /etc/init.d/functions
mysqld_pid_file_path="/application/mysql/data/web01.pid"
mysqld_safe=/application/mysql/bin/mysqld_safe

start(){

    /bin/sh $mysqld_safe --datadir=/application/mysql/data --pid-file=$mysqld_pid_file_path &>/dev/null &
    retval=$?
    sleep 2
    if [ $retval -eq 0 ]
    then
        action "mysql startup ok" /bin/true
        touch $lockfile
        return $retval
    else
        action "mysql startup fail" /bin/false
        return $retval
    fi
}
stop(){
    if test -s "$mysqld_pid_file_path"
    then
        mysqld_pid=`cat $mysqld_pid_file_path`
        if (kill -0 $mysqld_pid &>/dev/null)
        then
            kill $mysqld_pid
            retval=$?
            sleep 2
            if [ $retval -eq 0 ]
            then
                action "mysql stop ok" /bin/true
                rm $lockfile
                return $retval
            else
                action "mysql stop fail" /bin/false
                return $retval
            fi
         else
            echo " mysqld process is not exist."
            return 2
         fi
    else
        echo "$mysqld_pid_file_path is not exist,or mysqld does not startup."
    fi
}
case "$1" in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        sleep 2
        start
        retval=$?
        ;;
    *)
        echo "usage:$0 {start|stop|restart}"
        exit 1
esac
exit $retval

13.132.10經過awk同時分析出secure文件中每一個用戶被每一個ip破解的次數經過awk同時分析access.log文件每一個ip的重複數和每一個ip使用的流量

[root@oldboyedu-01 ~]# cat /oldboy/access.log |awk '{array[$1]++;sum[$1]=sum[$1]+$10}END{for (ip in array) print ip,array[ip],sum[ip]}'
180.97.106.162 2 336
180.97.106.37 4 672

13.142.10經過awk同時分析出secure文件中每一個用戶被每一個ip破解的次數

[root@oldboyedu-01 ~]# cat /oldboy/secure.txt |grep 'Failed'|awk '{array[$9,$11]++}END{for (i in array) print i,array[i]}'
oldboy10.0.0.1 2
oldboy10.0.0.3 1
root10.0.0.1 5
root10.0.0.2 3
相關文章
相關標籤/搜索