文章目录
shell脚本就是将命令写入文本中,文本可以被执行。
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。
简单使用
$0 表示当前脚本的名称
$* 表示脚本的所有参数
$# 表示脚本的参数的个数
$? 程序执行完后的结果,返回值0表示执行成功$n 表示脚本的第n个参数,n=1,2,3,4,5…9
#!bin/bash
echo "当前脚本的名称为$O"
双引号会解释变量
单引号会把变量当成字符串表示
没有给这个脚本赋予可执行权限就用bash
来执行该脚本
#!bin/bash
echo "当前脚本的名称为$O"
echo "总共有$#个参数,分别是$*"
#!bin/bash
echo "当前脚本的名称为$O"
echo "总共有$#个参数,分别是$*"
echo "第一个参数是$1,第三个参数是$3"
shell脚本参数判断
- 1、文件测试语句
-d
测试文件是否是目录类型- 是目录返回0,不是目录返回非0
-e
测试文件是否存在-f
判断是否为一般文件-r
判断当前用户对该文件是否有==读取==权限-w
判断当前用户对该文件是否有==写入==权限-x
判断当前用户对该文件是否有==执行==权限
- 2、逻辑测试语句
- 3、整数值测试语句
- 4、字符串比较语句
判断/etc/passwd
是否为目录
┌──(kali💋kali)-[~/Desktop]
└─$ [ -d /etc/passwd ]
┌──(kali💋kali)-[~/Desktop]
└─$ echo $? 1 ⨯
1
# $?表示上一步的结果,用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 ] 为真,确实是文件,
# 则执行后面的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"
整数的比较运算符
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 等于或小于
-ge 等于或大于
┌──(kali💋kali)-[~/Desktop]
└─$ [ 9 -gt 9 ]
┌──(kali💋kali)-[~/Desktop]
└─$ echo $?
1
字符串的比较运算
= 比较字符串内容是否相同
!= 比较字符串内容是否为空
-z 判断字符串内容是否为空
┌──(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 "该命令是检测服务器IP是否正常"
echo "直接在命令后面加参数IP就可以执行"
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 "请输入分数 [1--100]:" score
if [ $score -ge 85 ] && [ $score -le 100 ] ;then
echo "优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ] ;then
echo "合格"
else
echo "不合格"
fi
shell脚本循环
for循环
for 变量名 in 取值列表
do
命令序列
done
批量添加用户
#!/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添加成功"
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
检测同一局域网,多台主机存活情况
#!/bin/bash
read -p "请输入网络位:" NETWORK
for ip in $(seq 100 254) #seq用于生成数字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
多线程检测主机存活情况
#!/bin/bash
read -p "请输入IP网络位:" ip
for i in $(seq 1 254) #seq用于生成数字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中不支持多线程的.这里&是采用多进程执行方式,{}里执行了,不管结束没结束继续执行下一条.
done
wait #{}执行完,执行下一条,相当于高级语言多线程同步作用.
echo "扫描检测已结束。"
while循环
while 条件
do
命令序列
done
$RANDOM是linux中的内置变量,可以随机生成0-32767之间的整数数字
#!/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
case选择语句
case 变量值 in
模式1
命令序列1
模式2
命令序列2
....
默认命令序列
esac
#!/bin/bash
read -p "请输入一个字符:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "这是字母"
;;
[0-9])
echo "这是数字"
;;
*)
echo "这是特殊符号"
esac