shell脚本3
- for语句(一种循环控制结构,用于遍历列表或者范围内的元素,并对每个元素执行一段代码
- 语法格式
for 变量名 in 取值列表
do
命令序列
done
入门示例:
for i in 1 2 3 4 5 6 # for i in {1..6} 或 for i in $(cat /root/nums.txt)
do
echo $i
done
- While语句(一种循环控制结构,它会重复执行一段代码块,直到指定的条件为假为止。当条件为真时,代码块会被执行)
- 语法格式:
While [ 条件判断 ]
do
循环体
done
入门示例
i=1
while [ $i -le 10 ]
do
echo $i
let i++
done
换成for循环
for ((i=1;i<=10;i++))
do
echo $i
done
- case语句(一种用于多条件判断的控制结构)
- 语法格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认命令序列
esac
入门示例
提示用户输入一个字符,判断出该字符是字母、数字或者其他字符
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是字母。"
;;
[0-9])
echo "您输入的是数字。"
;;
*)
echo "您输入的是空格、功能键或其他控制字符。"
esac
- 应用实例
1通过员工名单列表,为公司每个员工创建一个账号,并设置初始密码,要求用户第一次登录改密码
创建一个员工列表并添加员工:
创建脚本编辑:jiaob.sh
users=$(cat /yuangong)
for user in $users
do
useradd $user
echo "$user:0000" | chpasswd
chage -d 0 $user
done
逐行解释:
users=$(cat /yuangong):
-
- 这行命令用于将文件 /yuangong 中的内容读取到变量 users 中。
- cat 命令用于将文件内容输出到标准输出。
for user in $users:
-
- 这是一个循环结构,用于遍历变量 users 中的每个用户名。
useradd $user:
-
- useradd 命令用于创建新用户。
- $user 是当前循环中的用户名。
echo "$user:0000" | chpasswd:
-
- echo "$user:0000" 输出用户名和密码,使用 : 分隔。
- | 将输出结果通过管道传递给 chpasswd 命令,用于设置用户密码。
- 初始密码为 "0000"。
chage -d 0 $user:
-
- chage 命令用于修改用户密码过期信息。
- -d 0 表示设置用户密码过期时间为 0,即下次登录时需要修改密码。
- $user 是当前循环中的用户名
效果:
2:通过服务器主机ip列表,批量检查主机生存状态
创建一个IP主机列表文件并添加IP:(这里为了展示实验效果,写了一个可访问一个不可访问的)
创建脚本:cat /jiao2.sh
hosts=$(cat /zhuji)
for host in $hosts
do
ping -c 3 -i 0.2 -W 1 $host &> /dev/null
if [ $? -eq 0 ]
then
echo "目标网段可以联机"
else
echo "目标网段不可达"
fi
done
具体步骤如下:
hosts=$(cat /zhuji):将文件 /zhuji 中的主机列表读取到变量 hosts 中。
for host in $hosts:使用循环遍历 hosts 中的每个主机。
ping -c 3 -i 0.2 -W 1 $host &> /dev/null:执行 ping 命令来检测主机的可达性。
-
- -c 3 表示发送 3 个 ICMP 回显请求。
- -i 0.2 表示设置间隔时间为 0.2 秒。
- -W 1 表示设置超时时间为 1 秒。
- $host 是当前循环中的主机地址。
- &> /dev/null 表示将 ping 命令的输出重定向到 /dev/null,即丢弃输出,只保留命令执行结果。
if [ $? -eq 0 ]:检查 ping 命令的退出状态码是否为 0,如果是则表示主机可以访问。
echo "目标网段可以联机":如果主机可以访问,则输出 "目标网段可以联机"。
else:如果主机不可访问,则执行以下操作。
echo "目标网段不可达":输出 "目标网段不可达"。
效果:
- 批量添加20个用户,要求用户名为前缀stu加两位数字组成(即stu01-stu20)
创建脚本:jb.sh
i=1
while [ $i -le 20 ]
do
if [ $i -lt 10 ]
then
useradd stu0$i
else
useradd stu$i
fi
let i++
done
具体步骤如下:
i=1:初始化一个变量 i,用于循环计数,起始值为 1。
while [ $i -le 20 ]:设置一个循环条件,当 i 的值小于等于 20 时执行循环体。
if [ $i -lt 10 ]:检查 i 的值是否小于 10,如果是,则执行以下操作。
useradd stu0$i:使用 useradd 命令创建用户名为 stu0$i 的用户账号,其中 $i 是循环计数器,如果 i 的值小于 10,则在用户名前面加上一个 0,比如 stu01、stu02 等。
else:如果 i 的值不小于 10,则执行以下操作。
useradd stu$i:创建用户名为 stu$i 的用户账号,其中 $i 是循环计数器,比如 stu10、stu11 等。
let i++:递增循环计数器 i 的值。
效果:
要查看历史命令,你可以使用类似以下的命令:
bashCopy Code
history
- 源码安装nginx,并把nginx添加成系统服务(nginx依赖包pcre-devel、zlib-devel、gcc)
源码安装:
https://nginx.org/download/nginx-1.24.0.tar.gz
tar xf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
yum -y install pcre-devel zlib-devel gcc #安装依赖包
./configure --prefix=/usr/local/nginx && make && make install
ps axuf 查看
ps axuf 是一个用于查看系统进程状态的命令。在 Linux 系统中,ps 命令用于显示当前进程的状态信息。下面是对 ps axuf 命令中各个选项的解释:
- a: 显示所有用户的进程,包括其他用户和系统进程。
- x: 显示没有控制终端的进程。
- u: 以用户为主的格式显示进程信息,包括用户、进程ID(PID)、CPU使用率、内存使用量等。
- f: 显示进程间的关系树,以树状结构展示进程之间的父子关系。
因此,ps axuf 命令将以树状结构显示所有用户的进程信息,包括进程间的父子关系,并且会显示没有控制终端的进程
创建多条件判断控制脚本(/etc/init.d
目录通常用于存放系统服务的启动脚本):
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 90 20
case $1 in
start)
/usr/local/nginx/sbin/nginx
;;
stop)
killall -s QUIT nginx
;;
restart)
killall -s QUIT nginx
/usr/local/nginx/sbin/nginx
;;
*)
echo "未知字符,请重新确认字符:start|stop|restart"
esac
添加执行权限:chmod +x /etc/init.d/nginx
测试:(netstat -lntp:查看端口号)
添加为系统服务:
(如果刚刚用脚本启动过服务,需要再用脚本把服务关闭)
chkconfig --add nginx
systemctl start或stop或restart nginx
编写测试访问页面内容,就可以访问了:vim /usr/local/nginx/html/index.html
也可以覆盖内容:
echo 欢迎访问 > /usr/local/nginx/html/index.html
如果要被访问的话需关闭防火墙:
systemctl stop firewalld
这个命令用于停止运行中的防火墙服务。在大多数基于系统D的Linux发行版中,firewalld
是默认的防火墙管理器,用于管理网络访问控制规则
setenforce 0
这个命令用于临时禁用SELinux(Security-Enhanced Linux)安全模块。SELinux是一个Linux内核安全模块,提供了强大的安全性增强功能,用于控制进程的访问权限。通过将其设置为"0",表示将SELinux设置为Permissive模式,即它会记录但不阻止违规操作