Shell腳本

Shell腳本:
特殊的後綴名的意義:
.sh            shell腳本文件
.py            python腳本文件
.jsp           Java網頁文件
.repo   yum倉庫配置文件
.php    php語言編寫文件
.html   html編寫的網頁文件
.db     數據庫文件
Shell的作用:
1、翻譯官,解釋用戶輸入的命令。
2、用戶的登錄shell程序,默認爲/bin/bash
3、shell腳本文件,編寫腳本代碼必須有執行權限。
Shell腳本的執行方式:
1、腳本的路徑:
     絕對路徑   root/first.sh
     相對路徑   首先切換到腳本文件所在的目錄,然後用”./腳本名”去執行。
注:必須腳本文件要有執行權限。
2、sh腳本路徑:
方法一:絕對路徑     sh  /opt/first.sh
方法二:相對路徑     首先切換到腳本文件所在的目錄,然後用”sh  腳本名”去執行。
3、source腳本路徑:
方法一:絕對路徑     source   /opt/first.sh
方法二:相對路徑     首先切換到腳本文件所在的目錄,然後用”source  腳本名”去執行。
Shell腳本的構成:
1、腳本聲明
#!/bin/bash     聲明後面的命令可以通過此shell程序去解釋並執行。
2、註釋信息
摘要、腳本的作用、參數說明、工作效率、創建日期、作者、版本聲明、第幾次的修改、每次返回的動態值得定義等
3、可執行的命令語句
注:所有特殊符號必須是英文模式輸入。
四大劍客:awk,sed,egrep,grep
管道符號的作用:將管道符號左側的命令執行的結果,作爲右側命令的處理對象。
重定向操作:
類型 操作符 用途
重定向輸入 < 從指定的文件讀取數據,而不是從鍵盤輸入
重定向輸出 > 將輸出結果保存到指定的文件(覆蓋原有內容)
重定向輸出 >> 將輸出結果追加到指定的文件(追加內容)
標準錯誤輸出 2> 將錯誤信息保存到指定的文件(覆蓋原有內容)
標準錯誤輸出 2>> 將錯誤信息追加到指定的文件中(追加內容)
混合輸出 &> 將標準輸出、標準錯誤的內容保存到同一個文件
混合輸出 &>> 將標準輸出、標準錯誤的內容保存到同一個文件中
自定義變量(小總結):
1、聲明變量不需要聲明類型
2、可以存儲不同類型內容  A=weixin01
3、有時候使用變量時要明確變量類型
4、嚴格區分大小寫
5、等於號兩邊不允許出現空格
6、首個字符必須是字母(a-z,A-Z或者_)
7、不能使用標點符號作爲變量名
8、不能使用bash裏面的關鍵字作爲變量名
最基本的賦值方法:
格式:變量名=變量值    等於號兩邊不允許爲空格。
查看變量
格式:echo     $變量名
          echo     ${變量名}
通過echo進行一個輸出變量,其中$是引用變量的特殊字符是特殊字符(必須要使用$符號)。
注:echo和調用的變量之間必須要有空格
當需要一起調用多個變量時,以空格隔開
當變量名和後面的字符混淆的時候,因使用{}將變量名括起來
變量賦值的特殊方法:
1、雙引號“”
注:echo和調用的變量之間必須要有空格
當需要一起調用多個變量時,以空格隔開
2、單引號‘’  所見即所得
禁止應用變量值,將$符號當作普通字符來使用
3、反撇號  ``
與$()效果一樣
作用:命令替換,提取命令執行的結果
ls -l `which useradd`
優先執行反撇號裏面的命令,在執行其他
變量賦值的時候,如果要賦值的是某條命令執行的結果,必須使用反撇號
缺點:反撇號不是實現嵌套命令替換操作,這時候使用$()來代替。
rpm  -qc  $(rpm  -qf  $(which  useradd))
A=`rpm  -qc  $(rpm  -qf  $(which  useradd))`
A=$(rpm  -qc  $(rpm  -qf  $(which  useradd)))
4、交互式賦值    read
read命令用於提示用戶輸入信息,從而實現簡單交互過程
(輸入命令就是一種交互式的過程)
多個變量名交互式賦值,賦值之間有空格,變量名也有空格。
爲了更友好,通常使用-p來設置提示信息
只是在當前shell程序中定義一個變量,但是到其他shell程序中無法引用
設置變量的作用範圍:
export  變量名=變量值
設置全值變量,所有子shell程序都可以使用此變量
數值變量的運算:
expr
$(())  加加:++   減減:--   2的n次方:2**n
環境變量:
常見的環境變量:
PWD:顯示當前所在的工作目錄
USER:用戶的名稱,可以查看當前登錄的用戶
HOME:用戶的加目錄,顯示當前用戶的家目錄
LANG:語言和字符集變量
PATH:命令搜索路徑,可以用tab鍵補全
PS1:提示符變量
位置變量:
方便通過命令行爲程序提供操作參數。
當執行命令時,第一個字段表示命令名或者腳本程序名,其餘的字符串參數按照從左到右的順序依次賦值給位置變量
第一個字段位置變量是$0
第二個字段位置變量是$1
第三個字段位置變量是$2
例子:  ls  /opt  /bot  /root
/opt/a.sh   /opt  

vi  weizhi.sh
#!/bin/bash
sum=$(($1+$2))
echo”$1+$2=$sum”
預定義變量腳本:
$#:代表命令行的位置變量的個數
$*:代表每個位置變量的內容
$?:返回上一次執行的結果,0爲正確    執行,非0的代表異常(報錯)
$0:代表當前執行的命令或者程序名
條件測試:
test 條件表達式   /  條件表達式
常用的測試操作符:
-d 測試是否爲目錄
-e 測試目錄或文件
-f 測試是否爲文件
-r 測試當前用戶是否有權限讀取read
-w 測試當前用戶是否有權寫入write
邏輯測試:
&&:邏輯與(可改爲"-a")
||:邏輯或(可改爲"-o")
!:邏輯否
整數值比較:
-eq  A=B
-ne  A≠B
-gt  A>B
-lt  A<B
-le  A<=B
-ge   A>=B
字符串比較:
格式1  [ 字符串1 = 字符串2 ]
          [ 字符串1 != 字符串2 ]
格式二   [ -z 字符串 ]
=:第一個字符串與第二個字符串相同
!=:第一個字符串與第二個字符串不相同,其中”!”符號表示取反
-z:檢查字符串是否爲空,對於未定義或賦予空值得變量將視爲空串
循環語句:
for循環語句:
需要指定一個變量以及可以取值的取值列表,針對每一個不同的取值相同的命令序列,直到變量值用盡,退出循環
取值列表:for語句的執行條件,其中包括多個屬性相同的對象,需要預先指定。
格式:
for  變量名  in 取值列表
do
命令序列
done
注:
for語句的操作對象爲用戶指定名稱的變量
通過in關鍵字爲改變量預先設置一個取值列表
多個取值之間以空格作爲分隔
do~done之間是一個循環體
應用領域:
1、字符串取值列表:
#!/bin/bash
#字符串取值列表
for HOME in 北京   上海  廣州  安徽  南京
do
echo  "$HOME歡迎你"
done

2、文件取值列表:
#!/bin/bash
#文件取值列表(命令執行取值列表)
i=1
for  USER  in  $(cat  /opt/a)
do
echo  ”$i號用戶:$USER”
let  i++ //循環加一
done
3、掃描ip地址:
#!/bin/bash
#掃描ip地址
for  IP  in  192.168.108.{1..254}   //1到254
do
ping  -c  3  -i  0.2  -W  1  $IP  &>  /dev/null
if  [ $? -eq 0 ];then
echo  “$IP  is  up!!!”
else
echo  “$IP  is  down!!!”
fi
done

要求:down的主機ip地址統計有多少個,up的有多少個??
#!/bin/bash
#掃描ip地址
up=0
down=0
for IP in 192.168.108.{1..254}
do
        ping -c 3 -i 0.2 -W 1 $IP &> /dev/null

        if [ $? -eq 0 ];then
                        echo "$IP is up!!!"
                 let  up++    
            else
                        echo "$IP is down!!!"
              let down++        
fi
done
       echo "up地址有=$up,down地址有=$down"
4、批量添加用戶:
方法一:同一個姓
#!/bin/bash
#批量添加用戶
for  A  in  teacher{1..5}
do
useradd  $A
echo  123  |  passwd  --stdin  $A  $>  /dev/null
done

方法二:不同姓名
vi  b.txt
lisi
zhangsan
wangwu
jack
#!/bin/bash
#批量添加用戶
for  A  in  $(cat  /opt/b)
do
useradd  $A
echo  123  |  passwd  --stdin  $A  $>  /dev/null
done
while循環語句:
while和for的區別
for語句非常適合用於列表對象無規律,且列表來源是固定的場合
while對於要求控制循環次數、操作對象按數字順序編號,按特定條件執行重複操作。
重複測試某個條件時,只要條件成立就會反覆執行(無限),除非強制終止,或者exit語句退出腳本
格式:
while  條件測試操作(判斷語句)
do
命令序列
done
應用領域
1、批量添加用戶
#!/bin/bash
U=”student”
i=1
while  [ $i  -le  10 ]
do
useradd  $U$i
echo  123  |  passwd  --stdin  $U$i  $>  /dev/null
let i++
done
2、交互式批量創建
#!/bin/bash
read  -p  “請輸入要創建用戶的前綴:”  X
read  -p  “請輸入要創建用戶的個數:”  M
read  -p  “請輸入用戶的初始密碼:”  N
i=1
while  [ $i  -le  $10 ]
do
useradd  $X$i
echo  “$N”  |  passwd  --stdin  $X$i  $>  /dev/null
chage  -d  0  $X$i
let i++
done
3、猜價格遊戲
#!/bin/bash
P=$(($PANDOM%1000))
T=0
echo  “商品實際價格範圍0~999,請猜一猜看是多少?”
while  true
do
read  -p  “請輸入猜測的價格數目:”INT
let  T++
if  [ $INT  -eq  $P ];then
echo  “恭喜答對了,實際價格是$P”
echo  ”你總共猜測了$T次”
exit  0   //正常退出腳本
elif  [ $INT  -gt  $P ];then
echo  “太高了”
else
echo  “太低了”
fi
done
作業:99乘法表
#!/bin/bash
#for loop
for (( i=1;i<=9;i++ ))
do
    for (( j=1;j<=i;j++  ))
    do
       let "temp=i*j"
       echo -n "$i*$j=$temp "
    done
    echo ""
done
shell函數
格式:
[ function ] 函數名(){
命令序列
[return  x]
}
注:
[ function ]是可寫可不寫,表示該函數的功能,可省略
()裏面是沒有內容的,固定格式
執行的命令序列放在{}裏面
[return  x]的作用是當命令序列執行完後返回給系統一個值相當於echo  $?
例子:
兩個求和
#!/bin/bash
sum(){
        echo "你需要計算的兩個整數分別是:$1和$2"
        SUM=$(($1+$2))
        echo "$1 + $2 = $SUM"
}
sum $1 $2
單分支:
if  條件測試操作
then
命令序列
fi
雙分支:
if  條件測試操作
then
命令序列1
else
命令序列2
fi
多分支:
if  條件測試操作
then
命令序列1
elif  條件測試操作2
then
命令序列2
else
命令序列3
fi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章