shell编程100例

您所在的位置:网站首页 shell编写工具 shell编程100例

shell编程100例

#shell编程100例| 来源: 网络整理| 查看: 265

1、编写hello world脚本

#!/bin/bash

# 编写hello world脚本

echo "Hello World!"

2、通过位置变量创建 Linux 系统账户及密码

#!/bin/bash

# 通过位置变量创建 Linux 系统账户及密码

#$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数

useradd "$1"

echo "$2" | passwd ‐‐stdin "$1"

3、备份日志

#!/bin/bash

# 每周 5 使用 tar 命令备份/var/log 下的所有日志文件

# vim /root/logbak.sh

# 编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖

# 注意 date 命令需要使用反引号括起来,反引号在键盘键上面

tar -czf log-`date +%Y%m%d`.tar.gz /var/log

# crontab ‐e #编写计划任务,执行备份脚本

00 03 * * 5 /root/logbak.sh

4、一键部署 LNMP(RPM 包版本)

#!/bin/bash

# 一键部署 LNMP(RPM 包版本)

# 使用 yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败

# 本脚本使用于 centos7.2 或 RHEL7.2

yum ‐y install httpd

yum ‐y install mariadb mariadb‐devel mariadb‐server

yum ‐y install php php‐mysql

systemctl start httpd mariadb

systemctl enable httpd mariadb

5、监控内存和磁盘容量,小于给定值时报警

#!/bin/bash

# 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员

# 提取根分区剩余空间

disk_size=$(df / | awk '/\//{print $4}')

# 提取内存剩余空间

mem_size=$(free | awk '/Mem/{print $4}')

while :

do

# 注意内存和磁盘提取的空间大小都是以 Kb 为单位

if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]

then

mail ‐s "Warning" root /dev/null

if [ $? -eq 0 ];then

echo "192.168.4.$i is up"

else

echo "192.168.4.$i is down"

fi

let i++

done

14、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(多进程版)

#!/bin/bash

# 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机

# 状态(多进程版)

#定义一个函数,ping 某一台主机,并检测主机的存活状态

myping(){

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

myping 192.168.4.$i &

done

# 使用&符号,将执行的函数放入后台执行

# 这样做的好处是不需要等待ping第一台主机的回应,就可以继续并发ping第二台主机,依次类推。

15、编写脚本,显示进度条

#!/bin/bash

# 编写脚本,显示进度条

jindu(){

while :

do

echo -n '#'

sleep 0.2

done

}

jindu &

cp -a $1 $2

killall $0

echo "拷贝完成"

16、进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示| / ‐ \

#!/bin/bash

# 进度条,动态时针版本

# 定义一个显示进度的函数,屏幕快速显示| / ‐ \

rotate_line(){

INTERVAL=0.5 #设置间隔时间

COUNT="0" #设置4个形状的编号,默认编号为 0(不代表任何图像)

while :

do

COUNT=`expr $COUNT + 1` #执行循环,COUNT 每次循环加 1,(分别代表4种不同的形状)

case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样

"1") #值为 1 显示‐

echo -e '‐'"\b\c"

sleep $INTERVAL

;;

"2") #值为 2 显示\\,第一个\是转义

echo -e '\\'"\b\c"

sleep $INTERVAL

;;

"3") #值为 3 显示|

echo -e "|\b\c"

sleep $INTERVAL

;;

"4") #值为 4 显示/

echo -e "/\b\c"

sleep $INTERVAL

;;

*) #值为其他时,将 COUNT 重置为 0

COUNT="0";;

esac

done

}

rotate_line

17、9*9 乘法表

#!/bin/bash

# 9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表)

for i in `seq 9`

do

for j in `seq $i`

do

echo -n "$j*$i=$[i*j] "

done

echo

done

18、使用死循环实时显示 eth0 网卡发送的数据包流量

#!/bin/bash

# 使用死循环实时显示 eth0 网卡发送的数据包流量

while :

do

echo '本地网卡 eth0 流量信息如下: '

ifconfig eth0 | grep "RX pack" | awk '{print $5}'

ifconfig eth0 | grep "TX pack" | awk '{print $5}'

sleep 1

done

19、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息

#!/bin/bash

# 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码

# 本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息

for i in `cat user.txt`

do

useradd $i

echo "123456" | passwd ‐‐stdin $i

done

20、编写批量修改扩展名脚本

#!/bin/bash

# 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件

# 执行脚本时,需要给脚本添加位置参数

# 脚本名 txt doc(可以将 txt 的扩展名修改为 doc)

# 脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg)

for i in "ls *.$1"

do

mv $i ${i%.*}.$2

done

21、使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

#!/bin/bash

# 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

# 删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机

rm ‐rf ~/.ssh/known_hosts

expect /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 Sorry!

esac

done

23、编写脚本快速克隆 KVM 虚拟机

#!/bin/bash

# 编写脚本快速克隆 KVM 虚拟机

# 本脚本针对 RHEL7.2 或 Centos7.2

# 本脚本需要提前准备一个 qcow2 格式的虚拟机模板,

# 名称为/var/lib/libvirt/images /.rh7_template 的虚拟机模板

# 该脚本使用 qemu‐img 命令快速创建快照虚拟机

# 脚本使用 sed 修改模板虚拟机的配置文件,将虚拟机名称、UUID、磁盘文件名、MAC 地址

# exit code:

# 65 ‐> user input nothing

# 66 ‐> user input is not a number

# 67 ‐> user input out of range

# 68 ‐> vm disk image exists

IMG_DIR=/var/lib/libvirt/images

BASEVM=rh7_template

read -p "Enter VM number: " VMNUM

if [ $VMNUM -le 9 ];then

VMNUM=0$VMNUM

fi

if [ -z "${VMNUM}" ]; then

echo "You must input a number."

exit 65

elif [[ ${VMNUM} =~ [a‐z] ]; then

echo "You must input a number."

exit 66

elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then

echo "Input out of range"

exit 67

fi

NEWVM=rh7_node${VMNUM}

if [ -e $IMG_DIR/${NEWVM}.img ]; then

echo "File exists."

exit 68

fi

echo -en "Creating Virtual Machine disk image......\t"

qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null

echo -e "\e[32;1m[OK]\e[0m"

#virsh dumpxml ${BASEVM} > /tmp/myvm.xml

cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml

sed -i "/${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml

sed -i "/uuid/s/.*/$(uuidgen)/" /tmp/myvm.xml

sed -i "/${BASEVM}\.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml

# 修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值

# 最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机

sed -i "/mac /s/a1/0c/" /tmp/myvm.xml

echo -en "Defining new virtual machine......\t\t"

virsh define /tmp/myvm.xml &> /dev/null

echo -e "\e[32;1m[OK]\e[0m"

24、点名器脚本

#!/bin/bash

# 编写一个点名器脚本

# 该脚本,需要提前准备一个 user.txt 文件

# 该文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名

while :

do

#统计 user 文件中有多少用户

line=`cat user.txt |wc ‐l`

num=$[RANDOM%line+1]

sed -n "${num}p" user.txt

sleep 0.2

clear

done

25、查看有多少远程的 IP 在连接本机

#!/bin/bash

# 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)

# 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有,

# -t仅显示 tcp 连接的信息,‐n 数字格式显示

# Local Address(第四列是本机的 IP 和端口信息)

# Foreign Address(第五列是远程主机的 IP 和端口信息)

# 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息

# sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数

netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c

26、对 100 以内的所有正整数相加求和(1+2+3+4...+100)

#!/bin/bash

# 对 100 以内的所有正整数相加求和(1+2+3+4...+100)

#seq 100 可以快速自动生成 100 个整数

sum=0

for i in `seq 100`

do

sum=$[sum+i]

done

echo "总和是:$sum"

27、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个

#!/bin/bash

# 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个

# awk 使用‐F 选项指定文件内容的分隔符是/或者:

# 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30

# 最后使用 wc ‐l 统计这样的数据有多少行,即多少个

awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8="13:30" && $7":"$8=1000{print $1}' /etc/passwd)

for i in $user

do

userdel -r $i

done

82、使用脚本开启关闭虚拟机

#!/bin/bash

# 使用脚本开启关闭虚拟机

# 脚本通过调用virsh命令实现对虚拟机的管理,如果没有该命令,需要安装 libvirt‐client 软件包

# $1是脚本的第1个参数,$2是脚本的第2个参数

# 第1个参数是你希望对虚拟机进行的操作指令,第2个参数是虚拟机名称

case $1 in

list)

virsh list --all

;;

start)

virsh start $2

;;

stop)

virsh destroy $2

;;

enable)

virsh autostart $2

;;

disable)

virsh autostart --disable $2

;;

*)

echo "Usage:$0 list"

echo "Usage:$0 [start|stop|enable|disable] VM_name"

cat $mountpoint/etc/sysconfig/network‐scripts/ifcfg‐$dev

fi

# 如果网卡配置文件中有客户配置的 IP 地址,则脚本提示修改 IP 完成

awk -F= -v x=$addr '$2==x{print "完成..."}' $mountpoint/etc/sysconfig/network‐scripts/ifcfg-$dev

86、破解虚拟机密码,无密码登陆虚拟机系统

#!/bin/bash

# 破解虚拟机密码,无密码登陆虚拟机系统

# 该脚本使用 guestmount 工具,Centos7.2 中安装 libguestfs‐tools‐c 可以获得 guestmount 工具

read -p "请输入虚拟机名称:" name

if virsh domstate $name | grep -q running ;then

echo "破解,需要关闭虚拟机"

virsh destroy $name

fi

mountpoint="/media/virtimage"

[ ! -d $mountpoint ] && mkdir $mountpoint

echo "请稍后..."

if mount | grep -q "$mountpoint" ;then

umount $mountpoint

fi

guestmount -d $name -i $mountpoint

# 将 passwd 中密码占位符号 x 删除,该账户即可实现无密码登陆系统

sed -i "/^root/s/x//" $mountpoint/etc/passwd

87、Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本

#!/bin/bash

# Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本

# 使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号

# 使用 kill ‐l 可以查看 Linux 系统中所有的信号列表,其中 2 代表 Ctrl+C

# trap 当发现有用户 ctrl+C 希望终端脚本时,就执行 echo "暂停 10s";sleep 10 这两条命令

# 另外用户使用命令:[ kill ‐2 脚本的 PID ] 也可以中断脚本和 Ctrl+C 一样的效果,都会被 trap 拦截

trap 'echo "暂停 10s";sleep 10' 2

while :

do

echo "go go go"

done

88、一键部署 memcached

#!/bin/bash

# 一键部署 memcached

# 脚本用源码来安装 memcached 服务器

# 注意:如果软件的下载链接过期了,请更新 memcached 的下载链接

wget http://www.memcached.org/files/memcached-1.5.1.tar.gz

yum -y install gcc

tar -xf memcached‐1.5.1.tar.gz

cd memcached‐1.5.1

./configure

make

make install

89、一键配置 VNC 远程桌面服务器(无密码版本)

#!/bin/bash

# 一键配置 VNC 远程桌面服务器(无密码版本)

# 脚本配置的 VNC 服务器,客户端无需密码即可连接

# 客户端仅有查看远程桌面的权限,没有鼠标和键盘的操作权限

rpm --quiet -q tigervnc‐server

if [ $? -ne 0 ];then

yum -y tigervnc‐server

fi

x0vncserver AcceptKeyEvents=0 AlwaysShared=1 \

AcceptPointerEvents=0 SecurityTypes=None rfbport=5908

90、关闭 SELinux

#!/bin/bash

# 关闭 SELinux

sed -i '/^SELINUX/s/=.*/=disabled/' /etc/selinux/config

setenforce 0

91、查看所有虚拟机磁盘使用量以及CPU使用量信息

#!/bin/bash

# 查看所有虚拟机磁盘使用量以及CPU使用量信息

virt‐df

read -n1 "按任意键继续" key

virt‐top

92、使用 shell 脚本打印图形

#!/bin/bash

# 使用 shell 脚本打印如下图形:

# 打印第一组图片

# for(())为类 C 语言的语法格式,也可以使用 for i in;do ;done 的格式替换

# for((i=1;i



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3