天天看點

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

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
           
腳本案例

[[email protected] 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"

[[email protected] 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腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

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腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
但在實際的操作中,如果把變量放在最後面,優先級并不是這樣,因為
[[email protected] ~]# cat ~/.bash_profile 

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
A=2
[[email protected] ~]# 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腳本後面接的參數個數
$* 不加""時,與$@一樣,後面的參數每個都是獨立的,不管參數是否用雙引号括起來
    加""時,為"$*"所有的參數都當做一個整體輸出
$@ 不加""時,與$*一樣,後面的參數每個都是獨立的,不管參數是否用雙引号括起來
   加""時,為"$@"每個參數是獨立的,但如果其中有參數是用雙括号括在一起的,則視為一個參數
[[email protected] 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                                                                 
[[email protected] 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
[[email protected] script]# 
           

2.5shell程序特殊狀态變量

$?擷取執行上一個指令的狀态傳回值,0為成功,非0是失敗
$$擷取目前執行的shell腳本的程序号--了解
$!擷取上一個背景運作的腳本的程序号--了解
$_擷取在此之前執行的指令或腳本的最後一個參數--了解
           

2.6變量字串

1.${oldboy}傳回變量${oldboy}的内容
[[email protected] script]# oldboy="oldoldyoungold"
[[email protected] script]# echo $oldboy
oldoldyoungold
[[email protected] script]# echo ${oldboy}
oldoldyoungold

2.${#oldboy}傳回變量${oldboy}的長度
[[email protected] script]# echo ${#oldboy}
14

3.${oldboy:offset}傳回變量${oldboy}從offset後開始到結尾的所有字元
[[email protected] script]# echo ${oldboy:2}
doldyoungold

4.${oldboy:offset:length}傳回變量${oldboy}從offset後開始,共取length個字元串
[[email protected] script]# echo ${oldboy:2:2}
do

5.${oldboy#word}從變量${oldboy}開頭開始删除最短比對的word字串
[[email protected] script]# echo ${oldboy#o*o}
ldyoungold

6.${oldboy##word}從變量${oldboy}開頭開始,删除最長比對的word字串
[[email protected] script]# echo ${oldboy##o*o}
ld

7.${oldboy%word}從變量${oldboy}結尾開始删除最短比對的word字串
[[email protected] script]# echo ${oldboy%o*o}
oldoldyoungold
[[email protected] script]# echo ${oldboy%d*d}
oldol
[[email protected] script]# echo ${oldboy%%d*d}
ol

8.${oldboy%%word}從變量${oldboy}結尾開始删除最長比對的word字串
[[email protected] script]# echo ${oldboy%%d*d}
ol

9.${oldboy/pattern/string}使用string代替第一個比對的pattern
[[email protected] script]# echo ${oldboy/o/O}
Oldoldyoungold

10.${oldboy//pattern/string}使用string代替所有比對的pattern
[[email protected] script]# echo ${oldboy//o/O}
OldOldyOungOld

11.${oldboy:-word}如果oldboy變量值為空或未指派,就會傳回word字元串替代變量的值,如果變量未定義,則傳回備用的值。防止變量為空或未定義導緻異常
[[email protected] script]# result=${test:-UNSET}
[[email protected] script]# echo $result
UNSET
[[email protected] script]# echo $test
[[email protected] script]# 
企業用途:
防止path變量沒定義
[[email protected] script]# find ${path:-/tmp} -name "*.log"---path變量無值
/tmp/dracut.log
/tmp/anaconda.log
/tmp/luffycity.log
[[email protected] script]# find ${path-/tmp} -name "*.log"
/tmp/dracut.log
/tmp/anaconda.log
/tmp/luffycity.log
[[email protected] script]# 
[[email protected] script]# touch /opt/aa.log
[[email protected] script]# path=/opt   ---path變量有值
[[email protected] script]# find ${path-/tmp} -name "*.log"
/opt/aa.log
[[email protected] script]# 
/etc/init.d/httpd
HTTPD_C"} HTTPD_LANG變量不存在,就用指派HTTPD_LANG=C
httpd=${HTTPD-/usr/sbin/httpd} HTTPD變量不存在,就指派httpd=/usr/sbin/httpd

12.${oldboy:=word}如果oldboy變量值為空或未指派,就設定這個變量值為word,并傳回值。位置變量和特殊變量不适用 用途:基本同上一個${oldboy:-word},但是又額外給oldboy變量指派了
[[email protected] script]# result1=${test1:=UNSET}
[[email protected] script]# echo $result1
UNSET
[[email protected] script]# echo $test1
UNSET
[[email protected] script]# 

13.${oldboy:?word}如果oldboy變量為空或未指派,word字元串将作為标準錯誤輸出,否則輸出變量的值 用途:用于捕捉由于變量未定義而導緻的錯誤,并退出程式
[[email protected] script]# echo ${oldboyNono:+replace}

[[email protected] script]# echo ${oldboyNono:?replace}
-bash: oldboyNono: replace
[[email protected] script]# 

14.${oldboy:+word}如果oldboy變量未空或未指派,則什麼都不做,否則word字元串替代變量的值
[[email protected] script]# resutl3=${test3:+word}
[[email protected] script]# echo $test3

[[email protected] script]# echo $result3

[[email protected] script]# test3=3
[[email protected] script]# resutl3=${test3:+word}
[[email protected] script]# echo $test3
3
[[email protected] script]# echo $resutl3
word
[[email protected] script]# 

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

3.數值計算

3.1算數運算符

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

3.2運算指令

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
[[email protected] script]# declare -i a=3+4
[[email protected] script]# echo $a
 7

[[email protected] script]# a=$[3+4]
[[email protected] 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))需要直接輸出表達式的運算結果時,可以在(())前面加$符
           
[[email protected] script]# echo $((2+3))
5
[[email protected] script]# i=$((2+3))
[[email protected] script]# echo $i
5
[[email protected] script]# echo $((8>7&&5==5))
1
[[email protected] script]# a=3
[[email protected] script]# echo $(($a+3))
6
[[email protected] script]#
           

3.2.2let運算指令--次推薦

[[email protected] script]# a=3
[[email protected] script]# a=a+2
[[email protected] script]# echo $a
a+2
[[email protected] script]# a=3
[[email protected] script]# let a=$a+3
[[email protected] script]# echo $a
6
           

3.2.3expr

1.1.用于計算
運算符及用于計算的數字左右都至少有一個空格,否則報錯
使用*号時,必須用反斜線屏蔽其特殊含義。因為shell可能會誤解*的含義
[[email protected] script]# expr 2 + 2
4
[[email protected] script]# expr 2 \* 2--->*号要用\*轉義
4
[[email protected] script]# expr 2 / 2
1

1.2.判斷一個變量值是否是整數
利用expr做計算時必須是整數的規則,吧一個變量或字元串和一個已知的整數(非0)相加,看指令傳回值是否為0,如果為0,就認為做加法的變量是整數,否則就不是整數
[[email protected] script]# i=5  指派一個數5給i
[[email protected] script]# expr $i + 6 &>/dev/null  把i和整數相加,&>/dev/null表示不保留任何輸出
[[email protected] script]# echo $?  輸出傳回值
0  傳回值為0,說明是整數
[[email protected] script]# i=value
[[email protected] script]# expr $i + 6 &>/dev/null
[[email protected] script]# echo $?
2  傳回值不為0,說明不是整數
[[email protected] script]# 

1.3.判斷檔案擴充名是否符合要求
[[email protected] 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
[[email protected] script]# sh extendName.sh ew.pub
you are using ew.pub
[[email protected] script]# sh extendName.sh ew.txt
pls use *.pub file
[[email protected] script]# 

1.4.計算字元串的長度
[[email protected] script]# a="i am a good colleage"
[[email protected] script]# expr length $a
expr: syntax error
[[email protected] script]# expr length "$a"
20
           

3.2.4适合小數的運算指令bc

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

3.2.5适合小數的運算指令awk----小數運算推薦awk

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

4.read

shell變量除了可以直接指派或腳本傳參外,還可以用read指令從标準輸入中獲得,read為bash内置指令,
-p設定提示資訊
-t設定輸入等待的時間,機關預設為秒
 操作案例:
 測試指令
           
[[email protected] script]# b="w e"
[[email protected] script]# echo "$b"|sed -r 's# ##g'|wc -L
2
[[email protected] script]# echo "$b"|wc -L
3
[[email protected] script]# b=""
[[email protected] script]# echo "$b"|wc -L
0
[[email protected] script]# echo "$b"|sed -r 's# ##g'|wc -L
0
[[email protected] script]# 
腳本内容
[[email protected] 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
[[email protected] script]# 
測試腳本
[[email protected] script]# sh cmpVar.sh 
please input two number:
you must input first number
[[email protected] script]# sh cmpVar.sh 
please input two number:2
you must input second number
[[email protected] script]# sh cmpVar.sh 
please input two number:2 3 4
you can just input two number
[[email protected] script]# sh cmpVar.sh 
please input two number:2 a
the two number must be int
[[email protected] script]# sh cmpVar.sh 
please input two number:w 3
the two number must be int
[[email protected] script]# sh cmpVar.sh 
please input two number:2 3
2<3
[[email protected] script]# sh cmpVar.sh 
please input two number:23 3
23>3
[[email protected] 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腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
為什麼需要檔案測試表達式?
 操作一個對象,就要看對象條件是否滿足,否則不要操作。
1、常見功能
2、實踐
3、企業應用:啟動腳本中的應用。
           

5.3字元串測試表達式

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
注意:
1、字元串就用雙引号
2、等号可以用一個或者兩個。
3、=号兩端必須要有空格。
 實踐:

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

5.4整數測試表達式

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

5.5邏輯測試表達式

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

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

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
[[email protected] scripts]# [ 1 -eq 1 -a -f /etc/hosts ] && echo 1 || echo 0
1
[[email protected] scripts]# [ 1 -eq 2 -a -f /etc/hosts ] && echo 1 || echo 0
0
[[email protected] scripts]# [ 1 -eq 2 && -f /etc/hosts ] && echo 1 || echo 0
-bash: [: missing `]'
0
[[email protected] scripts]# [[ 1 -eq 2 && -f /etc/hosts ]] && echo 1 || echo 0
0

[[email protected] scripts]# [ 1 -eq 2 ] && [ -f /etc/hosts ] && echo 1 || echo 0

[[email protected] scripts]# [ -f /etc/hosts ] && echo 1 || echo 0
1
[[email protected] 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腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

7.函數

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
企業案例:通過腳本傳參的方式,檢查Web 網站URL是否正常。
wget指令:
--spider 模拟爬蟲,不真正下載下傳
-q 安靜通路
-o /dev/null 不輸出
-T --timeout 逾時時間
-t --tries 重試次數
[[email protected] ~]# wget --spider -T 5 -q -o /dev/null -t 2 www.baidu.com
[[email protected] ~]# echo $?
0

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

[[email protected] ~]# 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 $*

[[email protected] 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腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例
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腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

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

shell腳本1.shell腳本初識2.shell變量3.數值計算4.read5.條件測試與比較6.if7.函數8.設定輸出字型顔色9.while10.for循環11. break、continue、exit、return的差別和對比12.數組13.案例

12.數組

12.1數組定義

•方法1:用小括号将變量值括起來指派給數組變量,每個變量值之間要用空格分隔。
文法如下:
array=(value1 value2 value3 ... ) 
此為常用定義方法,需重點掌握。
示例如下:
[[email protected] ~]# array=(1 2 3)    #<==用小括号将數組内容指派給數組變量,數組元素用“空格”分隔開。
[[email protected] ~]# echo ${array[*]} #<==輸出上面定義的數組的所有元素值,注意文法。
1 2 3

•方法2:用小括号将變量值括起來,同時采用鍵值對的形式指派。
文法如下:
array=([1]=one [2]=two [3]=three) 
此種方法為key-value鍵值對的形式,小括号裡對應的數字為數組下标,等号後面的内容為下标對應的數組變量的值,此方法比較複雜,不推薦使用。
示例如下:
[[email protected] ~]# array=([1]=one [2]=two [3]=three)
[[email protected] ~]# echo ${array[*]} #<==輸出上面定義的數組的所有元素值。 
one two three
[[email protected] ~]# echo ${array[1]} #<==輸出上面定義的數組的第一個元素值。
one
[[email protected] ~]# echo ${array[2]} #<==輸出上面定義的數組的第二個元素值。
two
[[email protected] ~]# echo ${array[3]} #<==輸出上面定義的數組的第三個元素值。
three

•方法3:通過分别定義數組變量的方法來定義。
文法如下:
array[0]=a;array[1]=b;array[2]=c
此種定義方法比較麻煩,不推薦使用。
示例如下:
[[email protected] ~]# array[0]=a
[[email protected] ~]# array[1]=b
[[email protected] ~]# array[2]=c
[[email protected] ~]# echo ${array[0]}
a

•方法4:動态地定義數組變量,并使用指令的輸出結果作為數組的内容。
文法為:
array=($(指令))
或
array=(`指令`)
示例如下:
[[email protected] data]# mkdir /array/ -p
[[email protected] data]# touch /array/{1..3}.txt
[[email protected] 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
[[email protected] data]# array=($(ls /array))
[[email protected] data]# echo ${array[*]}
1.txt 2.txt 3.txt
說明:還可以使用declare -a array來定義數組類型,但是比較少這樣用。
           

12.2操作數組元素

1.列印數組元素
此為常用知識點,需重點掌握。示例如下:
[[email protected] data]# array=(one two three)
[[email protected] data]# echo ${array[0]}
#<==列印單個數組元素用${數組名[下标]},當未指定數組下标時,數組的下标是從0開始。
one
[[email protected] data]# echo ${array[1]}
two
[[email protected] data]# echo ${array[2]}
three
[[email protected] data]# echo ${array[*]}   #<==使用*或者@可以得到整個數組内容。
one two three
[[email protected] data]# echo ${array[@]}   #<==使用*或者@可以得到整個數組内容。
one two three

2.列印數組元素的個數
此為常用知識點,需重點掌握。示例如下:
[[email protected] data]# echo ${array[*]}   #<==使用*或者@可以得到整個數組内容。
one two three
[[email protected] data]# echo ${#array[*]}  #<==用${#數組名[@或*]}可以得到數組長度,這和前文講解的變量子串知識是一樣的,因為數組也是變量,隻不過是特殊的變量,是以也适合變量的子串替換等知識。
3
[[email protected] data]# echo ${array[@]}   #<==使用*或者@可以得到整個數組内容。
one two three
[[email protected] data]# echo ${#array[@]}  #<==用${#數組名[@或*]}可以得到數組長度,這和前文講解的變量子串知識是一樣的,因為數組也是變量,隻不過是特殊的變量,是以也适合變量的子串替換等知識。
3

3.數組指派
此知識不常用,了解即可。可直接通過“數組名[下标] ”對數組進行引用指派,如果下标不存在,自動添加新一個數組元素,如果下标存在就覆寫原來的值。
示例如下:
[[email protected] data]# array=(one two three)
[[email protected] data]# echo ${array[*]}
one two three
[[email protected] data]# array[3]=four       #<==增加下标為3的數組元素。
[[email protected] data]# echo ${array[*]}
one two three four
[[email protected] data]# array[0]=oldboy
[[email protected] data]# echo ${array[*]}
oldboy two three four
[r[email protected] ~]# array[0]=oldboy        #<==修改數組元素。
[[email protected] ~]# echo ${array[@]}
oldboy 2 3 4

4.數組的删除
因為數組本質上還是變量,是以可通過“unset 數組[下标]”清除相應的數組元素,如果不帶下标,表示清除整個數組的所有資料。
示例如下:
[[email protected] data]# echo ${array[*]}
oldboy two three four
[[email protected] data]# unset array[1]   #<==取消下标為1的數組元素。
[[email protected] data]# echo ${array[*]} #<==列印輸出後發現數組元素“two”,不見了。
oldboy three four
[[email protected] data]# unset array      #<==删除整個數組。
[[email protected] data]# echo ${array[*]}
#<==沒有任何内容了。

5.數組内容的截取和替換
這裡和前文變量子串的替換是一樣的,因為數組是特殊的變量。數組元素部分内容截取的示例如下:
[[email protected] ~]# array=(1 2 3 4 5)
[[email protected] ~]# echo ${array[@]:1:3}          #<==從下标為1的元素開始截取,共取3個數組元素。
2 3 4
[[email protected] data]# array=({a..z})             #<==将變量的結果指派給數組變量。
[[email protected] 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
[[email protected] data]# echo ${array[@]:1:3}       #<==從下标為1的元素開始截取,共取3個數組元素。
b c d
[[email protected] data]# echo ${array[@]:0:2}       #<==從下标為0的元素開始截取,共取2個數組元素。
a b
數組元素部分内容的替換如下:
[[email protected] data]# array=(1 2 3 1 1)   
[[email protected] data]# echo ${array[@]/1/b}    #<==把數組中的1替換成b,原數組未被修改,和sed很像。
b 2 3 b b
提示:調用方法是:${數組名[@或*]/查找字元/替換字元} 該操作不會改變原先數組内容,如果需要修改,可以看上面例子,重新定義數組。
數組元素部分内容的删除如下:
[[email protected] data]# array=(one two three four five)
[[email protected] data]# echo ${array[@]}               
one two three four five
[[email protected] data]# echo ${array[@]#o*}    #<==從左邊開始比對最短的,并删除。 
ne two three four five
[[email protected] data]# echo ${array1[@]##o*}  #<==從左邊開始比對最長的,并删除。 
two three four five
[[email protected] data]# echo ${array[@]%f*}    #<==從右邊開始比對最短的,并删除。 
one two three
[[email protected] data]# echo ${array[@]%%f*}   #<==從右邊開始比對最長的,并删除。
one two three
提示:數組也是變量,是以也适合于前面講解過的變量的子串處理的功能應用。
數組的其他相關知識通過man bash然後搜Arrays來了解。
           

13.案例

13.1使用for循環在/oldboy目錄下批量建立10個html檔案,其中每個檔案需要包含10個随機小寫字母加強定字元串oldboy,建立的結果名稱案例如下

産生随機數的幾種方法
方法一

[[email protected] ~]# echo $RANDOM
 6283
範圍是0-32767
方法二

[[email protected] ~]# openssl rand -base64 10
 YWUxX2qeGpYxTw==

[[email protected] ~]# openssl rand -base64 5
 5TFO28c=

[[email protected] ~]#
方法三

[[email protected] ~]# date +%s%N
 1554090050912930903
方法四

[[email protected] ~]# head /dev/urandom |cksum
 1387668414 1488
方法五

[[email protected] ~]# uuidgen
 acabc769-db56-4cf8-bfe2-df1fc3d66f69
方法六

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

[[email protected] ~]# mkpasswd -l 11 -d 3 -C 3 -c 4
 wC304AbqCh>
-l長度
-d數字
-c小寫字母
-C大寫字母
-s特殊字元

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

腳本内容
[[email protected] 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
[[email protected] 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

[[email protected] 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
[[email protected] 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!

[[email protected] 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,并設定随機密碼

版本一:
[[email protected] 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
[[email protected] script]# 
[[email protected] 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.
[[email protected] script]# cat log/passwd.log 

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

版本二:
[[email protected] 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

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

完美版
[[email protected] 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
[[email protected] script]# 
[[email protected] 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掃描網絡記憶體活的主機

方法一:

[[email protected] 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
方法二:

[[email protected] script]# ping -c 1 -t 2 www.baidu.com2
 ping: unknown host www.baidu.com2

[[email protected] script]# echo $?
 2

[[email protected] 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

[[email protected] 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分庫分表

[[email protected] 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免秘鑰批量分分發檔案

[[email protected] 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 [email protected].$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
[[email protected] script]# 
[[email protected] script]# sh 7.distributeFile.sh /oldboy/ /ol
10.0.0.7 has recevied file                                 [  OK  ]
[[email protected] 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

這個是最快的,因為循環少了很多
[[email protected] 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
[[email protected] script]# 
[[email protected] script]# sh 8-2.encodeRandom.sh 
25667 2102929901ee1aa769d0f479d7d78b05  -
1346 00205d1cbbeb97738ad5bbdde2a6793d  -
25345 a3da1677501d9e4700ed867c5f33538a  -
7041 1f6d12dd61b5c7523f038a7b966413d9  -
10082 890684ba3685395c782547daf296935f  -

不用數組
[[email protected] 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
使用數組
[[email protected] 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
[[email protected] script]# 
[[email protected] script]# sh 8-1.encodeRandom.sh 
1346----00205d1c
7041----1f6d12dd
10082----890684b
25345----a3da1677
25667----21029299
           

13.9監測url

[[email protected] 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
[[email protected] script]# 
[[email protected] 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

[[email protected] 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

[[email protected] 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
[[email protected] script]#
           

13.11按單詞排序

[[email protected] 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

方法二:
[[email protected] 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

[[email protected] 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
[[email protected] 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使用的流量

[[email protected] ~]# 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破解的次數

[[email protected] ~]# 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