簡單Shell腳本編寫
Shell腳本概念
Shell 腳本是一種用于自動化執(zhí)行一系列命令和操作的腳本文件。它使用的是 Shell 解釋器(如 Bash、Korn Shell、Zsh 等)來解釋和執(zhí)行其中的命令。Shell 腳本通常用于編寫簡單的任務(wù)和工作流程,可以幫助我們進(jìn)行系統(tǒng)管理、批量處理、自動化部署等任務(wù)。
以.sh后綴名結(jié)尾的文件來表示該文件是一個Shell腳本。
Shell腳本就是將命令寫入文本中,文本可以被執(zhí)行。
1. 簡單腳本編寫
文件內(nèi)容如下:
編寫完腳本后,賦權(quán)文件的執(zhí)行權(quán)限
方式一:
chmod +x 腳本文件
方式二:
bash 腳本文件
2. Shell腳本參數(shù)
$0:表示當(dāng)前腳本的名稱。
$*:表示腳本的所有參數(shù)。
$#:表示腳本的參數(shù)的個數(shù)。
$n:表示腳本的第n個參數(shù),n=1,2,3…
$? :程序執(zhí)行完后的結(jié)果,返回值0表示執(zhí)行成功。
#!/bin/bash
echo "當(dāng)前腳本名稱$0"
echo "總共有$#個參數(shù),分別是$*。"
echo "第一個參數(shù)為$1,第三個參數(shù)為$3"
在執(zhí)行該Shell腳本文件的時候在后面添加三個參數(shù)分別是wuhu1,wuhu2,wuhu3。
執(zhí)行結(jié)果:
注意:
-
雙引號會解釋變量
-
單引號會把變量當(dāng)成字符串表示
2.1 Shell腳本參數(shù)判斷
2.1.1 文件測試語句
- -d:測試文件是否為目錄類型,是目錄返回0,不是目錄返回非0值。
- -e:測試文件是否存在。
- -f:判斷是否為一般文件。
- -r:判斷當(dāng)前用戶對該文件是否有讀取權(quán)限。
- -w:判斷當(dāng)前用戶對該文件是否有寫入權(quán)限。
- -x:判斷當(dāng)前用戶對該文件是否有執(zhí)行權(quán)限。
判讀是否為目錄
[ -d /etc/passwd ]
echo $? # $?返回上一次執(zhí)行命令的結(jié)果
說明:這里的[]
中輸入的內(nèi)容前后需要加空格
返回值為1,表示/etc/passwd不是目錄。
判斷當(dāng)前目錄下的wuhu是否為目錄
判斷是否為文件
[ -f /etc/passwd ]
echo $? # $?返回上一次執(zhí)行命令的結(jié)果
返回值為0,表示/etc/passwd是文件。
2.1.2 邏輯測試語句
邏輯運(yùn)算符:
- &&
- ||
- !
問題:上面所輸入命令十分的繁瑣,是否可以使用一條命令來完成上面的操作?
注意:這里是不能使用管道符的,使用管道符發(fā)現(xiàn)兩次的輸出值是不一樣的。
可以使用**&&**符號
- && 必須保證兩邊都為真,條件才會成立,只要有一個為假條件都不會成立。
- 只有當(dāng)左側(cè)命令執(zhí)行成功時,右側(cè)的命令才會被執(zhí)行。
[ -f /etc/passwd ] && echo "/etc/passwd是一個文件"
[ -d wuhu ] && echo "wuhu是一個目錄"
[ $USER = root ] && echo "該用戶是超級管理員用戶"
還可以使用**|| **符號
- || 兩邊有一個為真就為真,兩邊都為真也為真,兩邊為假才為假。
- 如果左側(cè)命令執(zhí)行成功(返回值為零),則右側(cè)的命令將不會被執(zhí)行。
[ $USER = root ] || echo "該用戶是超級管理員用戶" # 表示當(dāng)前用戶不是root輸出對應(yīng)的語句
[ ! $USER = root ] || echo "該用戶是超級管理員用戶" # 表示當(dāng)前用戶是root輸出對應(yīng)的語句
例如:要求普通用戶輸出user,管理員用戶輸出superuser
[ ! $USER = root ] && echo "user" || echo "superuser"
切換回普通用戶,執(zhí)行該命令
2.1.3 整數(shù)值測試語句
整數(shù)的比較運(yùn)輸符
- -eq:是否等于
- -ne:是否不等于
- -gt:是否大于
- -lt:是否小于
- -le:是否等于或小于
- -ge:是否等于或大于
[ 9 -eq 8 ]
echo $?
[ 9 -ne 8 ]
echo $?
free:查看內(nèi)存
現(xiàn)在需要輸出free中的Mem這一行
free -m | grep Mem | awk '{print $4}'
定義變量
Freemem=`free -m | grep Mem | awk '{print $4}'`
echo $Freemem # 輸出變量
例如:如果這個值小于1024的時候,會輸出內(nèi)容不足的提示信息。
[ $Freemem -gt 1024 ] && echo "內(nèi)存不足"
[ $Freemem -lt 1024 ] && echo "內(nèi)存不足"
2.1.4 字符串比較語句
字符串比較:
- =:比較字符串內(nèi)容是否相同。
- !=:比較字符串內(nèi)容是否不同。
- -z:判斷字符串內(nèi)容是否為空,如果為空返回0表示真,如果不為空返回1。
[ -z $String ]
echo $? # 返回結(jié)果為0,因為沒有定義過這個變量
[ -z $USER ]
echo $? # 返回結(jié)果為1,因為當(dāng)前用戶不為空
判斷當(dāng)前系統(tǒng)是否支持中文。
[ $LANG = zh_CN.UTF-8 ] && echo "支持中文" || echo "不支持中文"
3. Shell流程控制語句
流程控制語句
- if
- then
- else
- fi
3.1 if 條件測試語句
3.1.1 if…
基本格式如下:
if 條件測試語句
then
命令序列
fi 結(jié)束if語句
例如:判斷home目錄下是否存在test目錄,如果不存在則創(chuàng)建一個。
#!/bin/bash
DIR="/home/test"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
執(zhí)行結(jié)果
3.1.2 if…else…
基本格式如下:
if 條件測試語句
then
命令序列
else
命令序列
fi 結(jié)束if語句
例如:判斷給定的IP是否正常
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
echo "$1該IP是正常的"
else
echo "$1該IP無法ping通"
fi
說明:&>/dev/null在 Linux/Unix 系統(tǒng)中,“/dev/null” 是一個空設(shè)備文件,它可以用于丟棄不需要的輸出,相當(dāng)于一個黑洞。
執(zhí)行結(jié)果
然后就可以完善一下腳本內(nèi)容
#!/bin/bash
if [ -z $1 ]
then
echo "作者:小薛"
echo "該命令檢測服務(wù)器IP是否正常"
echo "直接在命令后面加參數(shù)IP就可以執(zhí)行"
else
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
echo "$1該IP是正常的"
else
echo "$1該IP無法ping通"
fi
fi
說明:
- “-c 3” 選項表示發(fā)送 3 個 ICMP 請求消息,并等待每個請求的響應(yīng)。
- “-i 0.2” 選項表示設(shè)置每個 ICMP 請求的時間間隔為 0.2 秒(即每 200 毫秒發(fā)送一個請求)。
- “-W 3” 選項表示設(shè)置等待響應(yīng)的超時時間為 3 秒。
執(zhí)行效果
3.1.3 if…elif…else
基本格式如下:
if 條件測試語句1
then
命令序列1
elif 條件測試語句2
then
命令序列2
else
命令序列3
fi 結(jié)束if語句
例如:判斷學(xué)員考試分?jǐn)?shù)如何
#!/bin/bash
read -p "請輸入分?jǐn)?shù)(1-100):" fenshu
if [ $fenshu -ge 85 ] && [ $fenshu -le 100 ];then
echo "該學(xué)生成績?yōu)閮?yōu)秀"
elif [ $fenshu -ge 70 ] && [ $fenshu -le 84 ];then
echo "該學(xué)生成績?yōu)楹细?
else
echo "該學(xué)生成績?yōu)椴缓细?
fi
說明:
- “-p” 選項用于在用戶輸入之前顯示一個提示信息。
- “read” 是一個 Bash 內(nèi)置命令,用于從標(biāo)準(zhǔn)輸入中讀取用戶輸入并將其賦值給一個變量。
- “fenshu” 是用于存儲用戶輸入值的變量名。
執(zhí)行效果如下
4. Shell腳本循環(huán)
4.1 for循環(huán)
基本格式:
for 變量名 in 取值列表
do
命令序列
done
4.1.1 批量添加用戶
創(chuàng)建一個用戶名的txt文件
編寫Shell腳本
#!/bin/bash
read -p "請輸入密碼:" PASSWORD
for USERNAME in `cat user.txt`
do
id $USERNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$USERNAME用戶已存在!"
else
useradd $USERNAME &> /dev/null
echo "$PASSWORD" | passwd --stdin $USERNAME &> /dev/null
echo "$USERNAME用戶創(chuàng)建成功"
fi
done
說明:
- –stdin:選項告訴passwd命令從標(biāo)準(zhǔn)輸入(stdin)讀取密碼,而不是要求用戶手動輸入密碼。
執(zhí)行結(jié)果如下:
創(chuàng)建前
創(chuàng)建后
4.1.2 批量刪除用戶
編寫Shell腳本
#!/bin/bash
for USERNAME in `cat user.txt`
do
id $USERNAME &> /dev/null
if [ $? -eq 0 ]
then
userdel -r $USERNAME &>/dev/null
echo "$USERNAME用戶已刪除"
else
echo "$USERNAME用戶不存在!"
fi
done
執(zhí)行結(jié)果
4.1.3 批量ping IP 地址
創(chuàng)建一個IP地址的txt文件
編寫Shell腳本
#!/bin/bash
HOSTLIST=$(cat /root/iplist.txt)
for IP in $HOSTLIST
do
ping -c 3 -i 0.2 -W 3 $IP &>/dev/null
if [ $? -eq 0 ]
then
echo "$IP該IP是正常的"
else
echo "$IP該IP無法ping通"
fi
done
說明:
- “$()” 是 Bash 中的命令替換語法,它表示將命令的輸出結(jié)果作為一個整體嵌入到命令行中。
執(zhí)行效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-692759.html
4.1.4 檢測同一局域網(wǎng),多臺主機(jī)存活情況
方式一:
#!/bin/bash
read -p "請輸入網(wǎng)絡(luò)位:" NETWORK
for ((IP=1;IP<=100;IP++))
do
ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
if [ $? -eq 0 ]
then
echo "$NETWORK.$IP該IP可以ping通"
else
echo "$NETWORK.$IP該IP無法ping通!!!!!!!"
fi
done
執(zhí)行結(jié)果:
方式二:
#!/bin/bash
read -p "請輸入網(wǎng)絡(luò)位:" NETWORK
for IP in `seq 1 254`
do
ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
if [ $? -eq 0 ]
then
echo "$NETWORK.$IP該IP可以ping通"
else
echo "$NETWORK.$IP該IP無法ping通!!!!!!!"
fi
done
說明:
- “seq” 是一個用于生成序列的命令。
- “1” 是序列的起始值。
- “254” 是序列的結(jié)束值。
執(zhí)行結(jié)果:
4.2 while循環(huán)
基本格式如下:
while 條件
do
命令序列
done
例如:猜測商品價格
編寫Shell腳本
#!/bin/bash
echo "該商品價格在0~1000之間,輸入價格來猜一猜"
TIMES=0
PRICE=$(expr $RANDOM % 1000 )
while true
do
read -p "請輸入價格:" INT
let TIMES++
if [ $INT -eq $PRICE ]
then
echo "恭喜您猜對了該商品的及格,價格為$INT"
echo "您猜了$TIMES次"
exit
elif [ $INT -gt $PRICE ];then
echo "您所輸入的價格高了"
else
echo "您所輸入的價格低了"
fi
done
說明:
- $RANDOM是linux中的內(nèi)置變量,可以隨機(jī)生成0-32767之間的整數(shù)數(shù)字。
- “expr” 是一個用于執(zhí)行基本數(shù)學(xué)運(yùn)算或字符串操作的命令。
執(zhí)行結(jié)果
4.3 case條件測試語句
基本格式如下:
case 變量值 in
模式1
命令序列1
模式2
命令序列2
....
默認(rèn)命令序列
esac
例如:判斷輸入的是字母,數(shù)字,還是特殊符號
編寫Shell腳本
#!/bin/bash
read -p "請輸入一個字符:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "這是字母"
;;
[0-9])
echo "這是數(shù)字"
;;
*)
echo "這是特殊符號"
esac
執(zhí)行效果如下:
文章來源地址http://www.zghlxwxcb.cn/news/detail-692759.html
到了這里,關(guān)于一篇文章教會你如何編寫一個簡單的Shell腳本的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!