shell--作业1

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


posted @ 2024-04-07 22:58  三思博客  阅读(9)  评论(0编辑  收藏  举报