shell--作业1
1 批量解压 使用for循环实现
模板一
#!/bin/bash
# 批量解压当前目录下的所有.tar文件
for tar_file in *.tar; do
if [ -f "$tar_file" ]; then
tar -xvf "$tar_file" && echo "解压 $tar_file 成功."
fi
done
# 批量解压当前目录下的所有.zip文件
for zip_file in *.zip; do
if [ -f "$zip_file" ]; then
unzip "$zip_file" && echo "解压 $zip_file 成功."
fi
done
# 批量解压当前目录下的所有.tar.gz文件
for tar_gz_file in *.tar.gz; do
if [ -f "$tar_gz_file" ]; then
tar -xzvf "$tar_gz_file" && echo "解压 $tar_gz_file 成功."
fi
done
echo "批量解压完成."
模板二
#!/bin/bash
# 显示菜单并获取用户选择
select ACTION in \
"1. 批量解压tar.gz文件" \
"2. 批量解压.zip和war文件" \
"3. 批量删除压缩文件" \
"4. 批量打包(未实现)" \
"5. 退出脚本"; do
case $ACTION in
"1. 批量解压tar.gz文件")
echo "批量解压tar.gz文件..."
find . -type f -name "*.tar.gz" -exec tar -xzvf {} \;
break
;;
"2. 批量解压.zip和war文件")
echo "批量解压.zip和war文件..."
find . -type f \( -name "*.zip" -o -name "*.war" \) -exec unzip {} \;
break
;;
"3. 批量删除压缩文件")
echo "批量删除压缩文件..."
read -p "警告:您将删除当前目录下的所有.tar.gz, .zip和.war文件,是否继续? (yes/no): " confirm
if [[ "$confirm" == "yes" ]]; then
find . -type f \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.war" \) -delete
fi
break
;;
"4. 批量打包(未实现)")
echo "抱歉,批量打包功能尚未实现。"
break
;;
"5. 退出脚本")
echo "退出脚本..."
exit 0
;;
*) echo "无效的选择,请重新选择。";;
esac
done
# 如果用户选择在指定路径执行操作,则此处添加询问路径的逻辑,并将上述find命令中的"."替换为用户指定的路径
# read -p "请输入指定路径(留空则使用当前目录): " PATH
# if [ ! -z "$PATH" ]; then
# ACTION="(指定路径)$ACTION"
# eval "$ACTION" # 替换路径后再执行命令
# fi
# 上述指定路径部分未实现,根据实际需求可以扩展此功能
2 公司的nginx日志太大 做一个日志切割,每天生成一个日志
模板1
#!/bin/bash
LOG_DIR=/usr/local/nginx/logs/
YESTERDAY_TIME=$(date -d "yesterday" +%F)
LOG_MONTH_DIR=$LOG_DIR/$(date +"%Y-%m")
LOG_FILE_LIST="access.log"
for LOG_FILE in $LOG_FILE_LIST; do
[ ! -d $LOG_MONTH_DIR ] && mkdir -p $LOG_MONTH_DIR
mv $LOG_DIR/$LOG_FILE $LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME}
done
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
#脚本注释
此脚本每天将nginx昨日的access.log移到按年月分的目录,并重命名,然后让nginx重新打开日志文件。流程如下:
1. 设置日志路径变量,昨日前缀名。
2. 循环处理access.log,创建昨月目录(如无)。
3. 移动access.log到昨月目录,并添加日期后缀。
4. 向nginx主进程发USR1信号,令其刷新日志文件。
模板2
nmkdir -p /usr/local/nginx/logs/date(为了存放切分日志文件的)
#!/bin/bash
#nginx log path
LOGS_PATH=/usr/local/nginx/logs/ #需要处理的日志路径
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
KEEPTIME=$(date -d "-30 days" +%Y-%m-%d)
#cut logs
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/date/access_${YESTERDAY}.log #移除昨天access.log日志
mv ${LOGS_PATH}/error.log ${LOGS_PATH}/date/error_${YESTERDAY}.log #移除昨天error.log日志
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid) #发送信号给nginx,使其重新打开日志文件
#remove 30 days before logs
rm -f ${LOGS_PATH}/date/access_{KEEPTIME}.log
rm -f ${LOGS_PATH}/date/error_{KEEPTIME}.log
此脚本每日自动整理nginx日志:
1. 获取昨天和30天前日期。
2. 将昨日access和error日志移动到/logs/date目录并重命名(加日期)。
3. 发送信号给nginx,使其重新打开日志文件。
4. 删除30天前的日志文件。
#补充:创建crontab定时任务
crontab -e
1 0 0 * * * sh /usr/local/nginx/logs/cut_nginx_log.sh
(使定时任务每天0点执行,将前一天的access.log和error.log文件改为带昨日日期时间戳的log文件,然后重载配置文件,生成新的access.log,error.log存储新一天的记录)
crontab -l
3 写一个脚本 实现判断 192.168.10.0/24 网络里 当前在线ip,能ping通 就是在线 ping不通 则打印 报警
#!/bin/bash
for ip in $(seq 1 254); do
address="192.168.10.$ip"
ping -c 1 -W 1 $address > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "$address 在线"
else
echo "$address 不在线 (报警)"
fi
done
效果
[root@centos7mage logs]# sh 3.sh
10.0.1.1 在线
10.0.1.2 在线
10.0.1.3 不在线 (报警)
10.0.1.4 不在线 (报警)
10.0.1.5 不在线 (报警)
10.0.1.6 不在线 (报警)
10.0.1.7 不在线 (报警)
10.0.1.8 不在线 (报警)
10.0.1.9 不在线 (报警)
10.0.1.10 不在线 (报警)
10.0.1.11 不在线 (报警)
10.0.1.12 不在线 (报警)
10.0.1.13 不在线 (报警)
4 写一个脚本完成 输入编号 输出需要查看内容:
1.help帮助
2.显示内存使用
3.显示磁盘使用
4.登录用户
5.查看ip
#!/bin/bash
function help_message {
echo "1. 显示帮助信息"
echo "2. 显示内存使用情况"
echo "3. 显示磁盘使用情况"
echo "4. 显示登录用户列表"
echo "5. 显示本机IP地址"
}
function display_memory_usage {
free -h
}
function display_disk_usage {
df -h
}
function show_logged_in_users {
who
}
function show_ip_address {
hostname -I
}
while true; do
echo "请选择操作:"
help_message
read -p "请输入编号: " choice
case $choice in
1) help_message ;;
2) display_memory_usage ;;
3) display_disk_usage ;;
4) show_logged_in_users ;;
5) show_ip_address ;;
*) echo "无效的选择,请重新输入!" ;;
esac
echo
done
效果
[root@centos7mage logs]# sh 2.sh
请选择操作:
1. 显示帮助信息
2. 显示内存使用情况
3. 显示磁盘使用情况
4. 显示登录用户列表
5. 显示本机IP地址
请输入编号: 1
1. 显示帮助信息
2. 显示内存使用情况
3. 显示磁盘使用情况
4. 显示登录用户列表
5. 显示本机IP地址
请选择操作:
1. 显示帮助信息
2. 显示内存使用情况
3. 显示磁盘使用情况
4. 显示登录用户列表
5. 显示本机IP地址
请输入编号: 2
total used free shared buff/cache available
Mem: 972M 156M 310M 7.5M 505M 654M
Swap: 4.0G 264K 4.0G
请选择操作:
1. 显示帮助信息
2. 显示内存使用情况
3. 显示磁盘使用情况
4. 显示登录用户列表
5. 显示本机IP地址
请输入编号: 3
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda2 94G 7.8G 86G 9% /
/dev/sda3 47G 33M 47G 1% /data
/dev/sda1 1014M 153M 862M 16% /boot
请选择操作:
1. 显示帮助信息
2. 显示内存使用情况
3. 显示磁盘使用情况
4. 显示登录用户列表
5. 显示本机IP地址
请输入编号: 4
root pts/0 2024-04-07 16:29 (10.0.1.1)
root pts/1 2024-04-07 12:57 (10.0.1.1)
请选择操作:
1. 显示帮助信息
2. 显示内存使用情况
3. 显示磁盘使用情况
4. 显示登录用户列表
5. 显示本机IP地址
请输入编号: 5
10.0.1.145
5 使用shell 完成 将当前目录下大于10K的文件批量转移到/tmp目录下
#!/bin/bash
find . -type f -size +10k -exec mv {} /tmp \;
echo "已完成转移大于10K的文件至/tmp目录。"
效果(部分展示)
[root@centos7mage tmp]# du -sh /tmp/
0 /tmp/
[root@centos7mage ~]# sh yd.sh
已完成转移大于10K的文件至/tmp目录。
[root@centos7mage ~]# du -sh /tmp/
594M /tmp/
HashTreeTraverser.html
HC4CookieHandler.html
HeaderAsPropertyRenderer.html
HeaderAsPropertyRendererWrapper.html
Header.html
HeaderManager.html
HeaderPanel.html
HeapDumper.html
Help.html
hints_and_tips.html
HitsPerSecondGraphConsumer.html
Hoic-高轨道离子炮-压力测试工具.rar
HoldSampleSender.html
HorizontalPanel.html
HTMLAssertionGui.html
HTMLAssertion.html
HtmlExtractorGui.html
HtmlExtractor.html
HtmlPane.html
HTMLParseException.html
HTMLParser.html
HtmlParsingUtils.html
HtmlReportAction.html
HtmlReportGenerator.html
html_report_menu.png
HtmlReportUI.html
HtmlTemplateExporter.html
HTTPAbstractImpl.html
HTTPArgument.html
HTTPArgumentsPanel.html
httpasyncclient-4.1.5.jar
httpclient-4.5.13.jar
HttpClientDefaultParameters.html
HTTPConstants.html
HTTPConstantsInterface.html
http-cookie-manager.png
httpcore-4.4.15.jar
httpcore-nio-4.4.15.jar
http-defaults1.png
http-defaults2.png
HttpDefaultsGui.html
HTTPFileArg.html
HTTPFileArgs.html
HTTPFileArgsPanel.html
HTTPFileImpl.html
HTTPHC4Impl.html
6.一键部署LNMP
#!/bin/bash
NGINX_V=1.15.6
PHP_V=5.6.36
TMP_DIR=/tmp
INSTALL_DIR=/usr/local
PWD_C=$PWD
echo
echo -e "\tMenu\n"
echo -e "1. Install Nginx"
echo -e "2. Install PHP"
echo -e "3. Install MySQL"
echo -e "4. Deploy LNMP"
echo -e "9. Quit"
function command_status_check() {
if [ $? -ne 0 ]; then
echo $1
exit
fi
}
function install_nginx() {
cd $TMP_DIR
yum install -y gcc gcc-c++ make openssl-devel pcre-devel wget
wget http://nginx.org/download/nginx-${NGINX_V}.tar.gz
tar zxf nginx-${NGINX_V}.tar.gz
cd nginx-${NGINX_V}
./configure --prefix=$INSTALL_DIR/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream
command_status_check "Nginx - 平台环境检查失败!"
make -j 4
command_status_check "Nginx - 编译失败!"
make install
command_status_check "Nginx - 安装失败!"
mkdir -p $INSTALL_DIR/nginx/conf/vhost
alias cp=cp ; cp -rf $PWD_C/nginx.conf $INSTALL_DIR/nginx/conf
rm -rf $INSTALL_DIR/nginx/html/*
echo "ok" > $INSTALL_DIR/nginx/html/status.html
echo '<?php echo "ok"?>' > $INSTALL_DIR/nginx/html/status.php
$INSTALL_DIR/nginx/sbin/nginx
command_status_check "Nginx - 启动失败!"
}
function install_php() {
cd $TMP_DIR
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel
wget http://docs.php.net/distributions/php-${PHP_V}.tar.gz
tar zxf php-${PHP_V}.tar.gz
cd php-${PHP_V}
./configure --prefix=$INSTALL_DIR/php \
--with-config-file-path=$INSTALL_DIR/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --enable-hash
command_status_check "PHP - 平台环境检查失败!"
make -j 4
command_status_check "PHP - 编译失败!"
make install
command_status_check "PHP - 安装失败!"
cp php.ini-production $INSTALL_DIR/php/etc/php.ini
cp sapi/fpm/php-fpm.conf $INSTALL_DIR/php/etc/php-fpm.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
/etc/init.d/php-fpm start
command_status_check "PHP - 启动失败!"
}
read -p "请输入编号:" number
case $number in
1)
install_nginx;;
2)
install_php;;
3)
install_mysql;;
4)
install_nginx
install_php
;;
9)
exit;;
esac