shell腳本就是將命令寫入文本中,文本可以被執(zhí)行。
腳本:本質(zhì)是一個文件,文件里面存放的是 特定格式的指令,系統(tǒng)可以使用腳本解析器 翻譯或解析 指令 并執(zhí)行(它不需要編譯)
shell 既是應(yīng)用程序,又是一種腳本語言(應(yīng)用程序 解析 腳本語言)。
簡單使用
$0 表示當(dāng)前腳本的名稱
$* 表示腳本的所有參數(shù)
$# 表示腳本的參數(shù)的個數(shù)
$? 程序執(zhí)行完后的結(jié)果,返回值0表示執(zhí)行成功$n 表示腳本的第n個參數(shù),n=1,2,3,4,5…9
#!bin/bash
echo "當(dāng)前腳本的名稱為$O"
雙引號會解釋變量
單引號會把變量當(dāng)成字符串表示
沒有給這個腳本賦予可執(zhí)行權(quán)限就用bash
來執(zhí)行該腳本
#!bin/bash
echo "當(dāng)前腳本的名稱為$O"
echo "總共有$#個參數(shù),分別是$*"
#!bin/bash
echo "當(dāng)前腳本的名稱為$O"
echo "總共有$#個參數(shù),分別是$*"
echo "第一個參數(shù)是$1,第三個參數(shù)是$3"
shell腳本參數(shù)判斷
- 1、文件測試語句
-
-d
測試文件是否是目錄類型- 是目錄返回0,不是目錄返回非0
-
-e
測試文件是否存在 -
-f
判斷是否為一般文件 -
-r
判斷當(dāng)前用戶對該文件是否有==讀取==權(quán)限 -
-w
判斷當(dāng)前用戶對該文件是否有==寫入==權(quán)限 -
-x
判斷當(dāng)前用戶對該文件是否有==執(zhí)行==權(quán)限
-
- 2、邏輯測試語句
- 3、整數(shù)值測試語句
- 4、字符串比較語句
判斷/etc/passwd
是否為目錄
┌──(kali??kali)-[~/Desktop]
└─$ [ -d /etc/passwd ]
┌──(kali??kali)-[~/Desktop]
└─$ echo $? 1 ?
1
# $?表示上一步的結(jié)果,用echo 輸出
返回值為1,表示/etc/passwd
不是目錄
┌──(kali??kali)-[~/Desktop]
└─$ ls
demo.sh zs
┌──(kali??kali)-[~/Desktop]
└─$ [ -d zs ]
┌──(kali??kali)-[~/Desktop]
└─$ echo $?
0
┌──(kali??kali)-[~/Desktop]
└─$ [ -d demo.sh ]
┌──(kali??kali)-[~/Desktop]
└─$ echo $? 1 ?
1
一條命令完成上述命令 &&
&& 必須保證兩邊都為真,條件才會成立,有一邊為假條件都不會成立
┌──(kali??kali)-[~/Desktop]
└─$ [ -f /etc/passwd ] && echo "該/etc/passwd是文件"
該/etc/passwd是文件
# [ -f /etc/passwd ] 為真,確實是文件,
# 則執(zhí)行后面的echo語句
┌──(kali??kali)-[~/Desktop]
└─$ [ $USER=kali ] && echo "該用戶是kali用戶"
該用戶是kali用戶
|| 兩邊有一個為真就為真,兩邊都為真也為真
┌──(kali??kali)-[~/Desktop]
└─$ [ $USER=kali ] || echo "該用戶是kali用戶"
! 表示取反
┌──(kali??kali)-[~/Desktop]
└─$ [ ! $USER=kali ] || echo "該用戶是kali用戶"
該用戶是kali用戶
要求普通用戶輸出user,管理員用戶輸出superuser
[ ! $USER = kali ] && echo "superuser" || echo "user"
整數(shù)的比較運算符
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 等于或小于
-ge 等于或大于
┌──(kali??kali)-[~/Desktop]
└─$ [ 9 -gt 9 ]
┌──(kali??kali)-[~/Desktop]
└─$ echo $?
1
字符串的比較運算
= 比較字符串內(nèi)容是否相同
!= 比較字符串內(nèi)容是否為空
-z 判斷字符串內(nèi)容是否為空
┌──(kali??kali)-[~/Desktop]
└─$ [ $LANG = "en_US.UTF-8" ] && echo "支持英文" || echo "支持中文"
支持英文
shell腳本流程控制
if 條件
then 命令
else 命令
fi
if…
#!/bin/bash
DIR="/home/kali/Desktop/demo"
if [ ! -e $DIR]
then
mkdir -p $DIR
fi
if…else…
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
echo "該$1是正常的"
else
echo "該$1是不正常的"
fi
if…else…多級嵌套
#!/bin/ash
if [ -z $1 ]
then
echo "作者:zs"
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是正常的"
else
echo "該$1是不正常的"
fi
fi
if…elif…else
read -p "請輸入分?jǐn)?shù) [1--100]:" score
if [ $score -ge 85 ] && [ $score -le 100 ] ;then
echo "優(yōu)秀"
elif [ $score -ge 70 ] && [ $score -le 84 ] ;then
echo "合格"
else
echo "不合格"
fi
shell腳本循環(huán)
for循環(huán)
for 變量名 in 取值列表
do
命令序列
done
批量添加用戶
#!/bin/bash
#循環(huán)語句
read -p "請輸入密碼:" PASSWORD
for USERNAME in `cat user.txt`
do
id $USERNAME &>/dev/null
if [ $? -eq 0 ]
then
echo "該用戶$USERNAME 已經(jīng)存在"
else
useradd $USERNAME &>/dev/null
echo "$PASSWORD"| passwd --stdin $USERNAME &>/dev/null
echo "該用戶$USERNAME添加成功"
fi
done
批量ping IP地址
#!/bin/bash
#批量pingIP地址
HOSTLIST=$(cat /home/kali/Desktop/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
檢測同一局域網(wǎng),多臺主機存活情況
#!/bin/bash
read -p "請輸入網(wǎng)絡(luò)位:" NETWORK
for ip in $(seq 100 254) #seq用于生成數(shù)字100~254
do
ping -c 3 -i 0.2 -w 3 $NETWORK.$ip &>/dev/null && result=0 || result=1
if [ $result -eq 0 ];then
echo "IP地址: $NETWORK.$ip is up !!"
echo $NETWORK.$ip >> /tmp/up.txt
else
echo "IP地址: $NETWORK.$ip is down !!"
echo $NETWORK.$ip >> /tmp/down.txt
fi
done
多線程檢測主機存活情況
echo輸入帶顏色的內(nèi)容相關(guān)博客
#!/bin/bash
read -p "請輸入IP網(wǎng)絡(luò)位:" ip
for i in $(seq 1 254) #seq用于生成數(shù)字1~254
do
{
ping $ip.$i -c1 -s1 2>&1 1>/dev/null &&
echo -e ping $ip.$i 是 "\033[32m通的!\033[0m" ||
echo -e ping $ip.$i 是 "\033[31m不通的!\033[0m"
} & #注意在shell中不支持多線程的.這里&是采用多進程執(zhí)行方式,{}里執(zhí)行了,不管結(jié)束沒結(jié)束繼續(xù)執(zhí)行下一條.
done
wait #{}執(zhí)行完,執(zhí)行下一條,相當(dāng)于高級語言多線程同步作用.
echo "掃描檢測已結(jié)束。"
while循環(huán)
while 條件
do
命令序列
done
$RANDOM是linux中的內(nèi)置變量,可以隨機生成0-32767之間的整數(shù)數(shù)字
#!/bin/bash
TIMES=0
echo "該商品的價格為0--999之間,來猜一猜!"
PRICE=$(expr $RANDOM % 1000 )
while true
do
read -p "請輸入價格:" INT
let TIMES++ #自增
if [ $INT -eq $PRICE ];then
echo "恭喜你猜對了,價格為$PRICE"
echo "猜了$TIMES次"
exit
elif [ $INT -gt $PRICE ];then
echo "猜高了"
else
echo "太低了"
fi
done
文章來源:http://www.zghlxwxcb.cn/news/detail-683198.html
case選擇語句
case 變量值 in
模式1
命令序列1
模式2
命令序列2
....
默認(rèn)命令序列
esac
#!/bin/bash
read -p "請輸入一個字符:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "這是字母"
;;
[0-9])
echo "這是數(shù)字"
;;
*)
echo "這是特殊符號"
esac
文章來源地址http://www.zghlxwxcb.cn/news/detail-683198.html
到了這里,關(guān)于簡單shell腳本的編寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!