1、脚本1 人机<石头,剪刀,布>游戏
case value in
value1)
command1
command2
...
commandN
;;
value2)
command1
command2
...
commandN
;;
*)
xxxx
esac
输入的value对应为它设置对应的执行命令区域(;;表示区域命令执行完毕),没有该value,使用星号 * 捕获该值,再执行后面的命令。在 * 中不需要;;结尾
- 【 -eq】 == equal
- 【 -nq】 == not equal
#!/bin/bash
game=(石头 剪刀 布)
num=$[RANDOM%3]
robot=${game[$num]}
# 首先自定义出“机器人”所使用的的手势,使用随机函数创建一个随机数跟3取余 \
# 出拳的可能性保存在一个数组中,game[0],game[1],game[2]分别是 3 中不同的可能(石头 剪刀 布)
echo "请选择出拳手势"
echo "1.石头"
echo "2.剪刀"
echo "3.布"
read -p "请选择 1‐3:" gesture ##read需要在屏幕输入数据 并保存在gesture这个变量中
case $gesture in
1)##你选择了出石头
if [ $num -eq 0 ]##假如机器人除了石头
then
echo "平局"
elif [ $num -eq 1 ]##假如机器人出了剪刀
then
echo "你赢"
else##假如机器人出了布
echo "机器人赢"
fi;;
2)
if [ $num -eq 0 ]
then
echo "机器人赢"
elif [ $num -eq 1 ]
then
echo "平局"
else
echo "你赢"
fi;;
3)
if [ $num -eq 0 ]
then
echo "你赢"
elif [ $num -eq 1 ]
then
echo "机器人赢"
else
echo "平局"
fi;;
*) ##输入了其他数值
echo "必须输入 1‐3 的数字"
esac##结束
脚本1是一个较为简单的case语法和逻辑。
2、 局域网内主机开启情况
for循环 for value in {xx }
echo &> /dev/null 将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃
编写脚本测试 局域网中192.168.0.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
for i in {1..254}
do
# 每隔0.5秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
ping ‐c 2 ‐i 0.5 ‐W 1 192.168.0.$i &>/dev/null
if [ $? -eq 0 ];then
echo "192.168.0.$i is up"
else
echo "192.168.0.$i is down"
fi
done
可以使用函数,将每一次的函数后台(&)运行,不必等到主机响应动作完成再进行下一次的探测
pingalive(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
pingalive 192.168.4.$i &
done
3、 进度条
#!/bin/bash
do_main() {
#运行的主程序 在这里放入将要运行的程序
sleep 20
}
progress() {
#设置初始参数
local main_pid=$1
local length=20
local ratio=1
while [ "$(ps -p ${main_pid} | wc -l)" -ne "1" ] ; do #验证程序是否还在运行
mark='>' ##覆盖图标
progress_bar=
for i in $(seq 1 "${length}"); do ##创建初始进度条
if [ "$i" -gt "${ratio}" ] ; then
mark='-'
fi
progress_bar="${progress_bar}${mark}"
done
printf "Progress: ${progress_bar}\r"
ratio=$((ratio+1))
if [ "${ratio}" -gt "${length}" ] ; then
ratio=1 ##一次覆盖完成,ratio回复
fi
sleep 0.5
done
}
do_main & do_main_pid=$(jobs -p | tail -1) #获取pid
progress "${do_main_pid}" & progress_pid=$(jobs -p | tail -1) #将pid放入progress函数
wait "${do_main_pid}" #等待进程完成
printf "Progress: done \n"
实现的效果还只是表面的,并不能实时的展现内部程序运行的结果
更多是一个方法论,怎么去用>覆盖原先的-
4、 批量修改文件名
编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件
#!/bin/bash
# 设置两个参数表示在当前目录想修改的后缀以及修改后的后缀
#判断是否输入了两个参数,没有输出两个则退出脚本
if [ $# -eq 2 ];
then
echo "$1 $2 已经传入脚本"
else
echo "错误"
fi
for i in `ls *.$1`
do
mv $i ${i%.*}.$2
done
5、 一键部署LNMP
多代码的脚本还是要多用函数有小问题需要修改时方便找出
#!/bin/bash
# 一键部署 LNMP(源码安装版本)
menu()
{
clear
echo " ##############‐‐‐‐Menu‐‐‐‐##############"
echo "# 1. Install Nginx"
echo "# 2. Install MySQL"
echo "# 3. Install PHP"
echo "# 4. Exit Program"
echo " ########################################"
}
choice()
{
read -p "Please choice a menu[1‐4]:" select
}
install_nginx()
{
id nginx &>/dev/null
if [ $? -ne 0 ];then
useradd -s /sbin/nologin nginx
fi
if [ -f nginx‐1.8.0.tar.gz ];then
tar -xf nginx‐1.8.0.tar.gz
cd nginx‐1.8.0
yum -y install gcc pcre‐devel openssl‐devel zlib‐devel make
./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
make
make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
cd ..
else
echo "没有 Nginx 源码包"
fi
}
install_mysql()
{
yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
id mysql &>/dev/null
if [ $? -ne 0 ];then
useradd -s /sbin/nologin mysql
fi
if [ -f mysql‐5.6.25.tar.gz ];then
tar -xf mysql‐5.6.25.tar.gz
cd mysql‐5.6.25
cmake .
make
make install
/usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
‐‐basedir=/usr/local/mysql/
chown -R root.mysql /usr/local/mysql
chown -R mysql /usr/local/mysql/data
/bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
/bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
ldconfig
echo 'PATH=\$PATH:/usr/local/mysql/bin/' >> /etc/profile
export PATH
else
echo "没有 mysql 源码包"
exit
fi
}
install_php()
{
#安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等
yum -y install gcc libxml2‐devel
if [ -f mhash‐0.9.9.9.tar.gz ];then
tar -xf mhash‐0.9.9.9.tar.gz
cd mhash‐0.9.9.9
./configure
make
make install
cd ..
if [ ! ‐f /usr/lib/libmhash.so ];then
ln -s /usr/local/lib/libmhash.so /usr/lib/
fi
ldconfig
else
echo "没有 mhash 源码包文件"
exit
fi
if [ -f libmcrypt‐2.5.8.tar.gz ];then
tar -xf libmcrypt‐2.5.8.tar.gz
cd libmcrypt‐2.5.8
./configure
make
make install
cd ..
if [ ! -f /usr/lib/libmcrypt.so ];then
ln -s /usr/local/lib/libmcrypt.so /usr/lib/
fi
ldconfig
else
echo "没有 libmcrypt 源码包文件"
exit
fi
if [ -f php‐5.4.24.tar.gz ];then
tar -xf php‐5.4.24.tar.gz
cd php‐5.4.24
./configure ‐‐prefix=/usr/local/php5 ‐‐with‐mysql=/usr/local/mysql ‐‐enable‐fpm ‐‐
enable‐mbstring ‐‐with‐mcrypt ‐‐with‐mhash ‐‐with‐config‐file‐path=/usr/local/php5/etc ‐‐with‐
mysqli=/usr/local/mysql/bin/mysql_config
make && make install
/bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
/bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
cd ..
else
echo "没有 php 源码包文件"
exit
fi
}
while :
do
menu
choice
case $select in
1)
install_nginx
;;
2)
install_mysql
;;
3)
install_php
;;
4)
exit
;;
*)
echo error number! #输出非菜单值,退出
esac
done
6、 查看某个时间段的服务请求和IP地址
条件判断
按照新的分离条件(/:)在文档中的$7“:“$8是时间点,而同时也可以用来与时间单位做比较
# 最后使用 wc ‐l 统计这样的数据有多少行,即多少个
num=$(awk -F "[ /:]" '$7":"$8>="09:00" && $7":"$8<="18:00"' /var/log/httpd/access_log |wc -l)
echo "xx时间段有 $num 条请求"
awk -F "[ /:]" '$7":"$8>="09:00" && $7":"$8<="18:00"{print 有 $1 这个ip访问过}' /var/log/httpd/access_log
7、 nginx启停脚本
脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本
本脚本名为/etc/init.d/nginx,则 service nginx start 就可以启动该服务
#!/bin/bash
#设置好nginx的相关目录
program=/usr/local/nginx/sbin/nginx
npid=/usr/local/nginx/logs/nginx.pid
start(){
if [ -f $npid ];then #-f是否有这个文件
echo "nginx 已经处于开启状态"
else
$program #开启nginx服务
fi
stop(){
if [ -! -f $npid ];then #开启之后在指定文件夹存在pid文件
echo "nginx 服务已经关闭"
else
$program -s stop
echo "关闭服务 ok"
fi
}
status(){
if [ -f $pid ];then
echo "服务正在运行..."
else
echo "服务已经关闭"
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
stop
sleep 1
start;;
status)
status;;
*)
echo "$0 {usage|arg}"
esac
8、 检测文件是否被修改过
使用md5对文件的数据进行加密得出唯一hash值,在有人改动过之后再次进行md5计算会产生不一样的值,
通过这种方式检测文件是否被修改过
#!/bin/bash
# 本示例脚本检测的是/etc 目录下所有的 conf 结尾的文件,根据实际情况,您可以修改为其他目录或文件
for i in $(ls /etc/*.conf)
do
md5sum "$i" >> /var/log/conf_file.log
done
if [$(cat /var/log/conf_file.log)|wc -l -gt 2 ];then
num1=$(sed 1p /var/log/conf_file.log )
num2=$(tail -n 1 /var/log/conf_file.log)
if [num1 -eq];then
echo "文件没有被修改过"
else
echo "文件被修改过"
fi
else
echo "你第一次启动该脚本"
fi
for i in $(awk {print $1})
**9、**随机输出8位长的密码
通过先列举出所有常用字符,再通过random函数循环随机输出字符并存储
$#统计密码库的长度 给到random取值
KaTeX parse error: Expected '}', got 'EOF' at end of input: {key:index:1} 在index步长中抽取字符
#!/bin/bash
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
num=${#key}
pass=''
# 每次都是随机数对密码库的长度取余,确保提取的密码字符不超过密码库的长度
# 每次循环提取一位随机密码,并将该随机密码追加到 pass 变量的最后
for i in {1..8}
do
index=$[RANDOM%num]
password=$password${key:$index:1}
done
echo $password
或者使用tr函数给出想要字符类型,让函数随机输出
tr -dc '_A‐Za‐z0‐9' </dev/urandom | head -c 10
**10、**打包备份数据
&&是前一个命令执行成功了才会执行后一条命令
-z 查看是否为空
#!/bin/bash
# 制定目录路径,脚本自动将该目录使用 tar 命令打包备份到/data目录
[ ! -d /data ] && mkdir /data
[ -z $1 ] && exit ##为空则退出
if [ -d $1 ];then
tar -czf /data/$1.-`date +%Y%m%d`.tar.gz $1
else
echo "该目录不存在"
exit 107
fi
echo "备份完成"