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