shell习题-30
题目要求
需求背景: 领导要求小美备份数据库服务器里面的100个库(数据量在几十到几百G),需要以最快的时间完成(5小时内),并且不能影响服务器性能。 参考答案screen exec 100<>test.fifo 这样可以把fd100读和写全部指定到test.fifo中 #!/bin/bash #这个脚本用来并发备份数据库 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-19 ##假设100个库的库名、host、port以及配置文件路径存到了一个文件里,文件名字为/tmp/databases.list ##格式:db1 10.10.10.2 3308 /data/mysql/db1/my.cnf ##备份数据库使用xtrabackup(由于涉及到myisam,命令为inoobackupex) exec &> /tmp/mysql_bak.log if ! which innobackupex &>/dev/nll then echo "安装xtrabackup工具" rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm && yum install -y percona-xtrabackup-24 if [ $? -ne 0 ] then echo "安装xtrabackup工具出错,请检查。" exit 1 fi fi bakdir=/data/backup/mysql bakuser=vyNctM bakpass=99omeaBHh function bak_data { db_name=$1 db_host=$2 db_port=$3 cnf=$4 [ -d $bakdir/$db_name ] || mkdir -p $bakdir/$db_name innobackupex --defaults-file=$4 --host=$2 --port=$3 --user=$bakuser --password=$bakpass $bakdir/$1 if [ $? -ne 0 ] then echo "备份数据库$1出现问题。" fi } fifofile=/tmp/$$ mkfifo $fifofile exec 1000<>$fifofile thread=10 for ((i=0;i<$thread;i++)) do echo >&1000 done cat /tmp/databases.list | while read line do read -u1000 { bak_data `echo $line` echo >&1000 } & done wait exec 1000>&- rm -f $fifofile 题目要求之前咱们打印过正方形,也打印过乘法口诀,那今天来打印一个三角形(正三角形,元素用*表示)。 参考答案#!/bin/bash #这个脚本用来打印三角形 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-19 while true do read -p "please input the lenth: " n if [ -z $n ] then echo "要输入一个数字。" continue else n1=`echo $n|sed ‘s/[0-9]//g‘` if [ -n "$n1" ] then echo "你输入的不是纯数字,重新输入。" continue else break fi fi done for i in `seq 1 $n` do j=$[$n-$i] for m in `seq $j` do echo -n " " done for p in `seq 1 $i` do echo -n "* " done echo done 题目要求利用你学过的知识点,想办法根据要求截取出字符。 字符串var=http://www.aaa.com/root/123.htm 1.取出www.aaa.com/root/123.htm 2.取出123.htm 3.取出http://www.aaa.com/root 4.取出http: 5.取出http:// 6.取出root/123.htm 7.取出123 参考答案#!/bin/bash #这个脚本用来截取字符串 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-19 var=http://www.aaa.com/root/123.htm echo "1.取出www.aaa.com/root/123.htm" echo $var |awk -F ‘//‘ ‘{print $2}‘ echo "2.取出123.htm" echo $var |awk -F ‘/‘ ‘{print $5}‘ echo "3.取出http://www.aaa.com/root" echo $var |sed ‘s#/123.htm##‘ echo "4.取出http:" echo $var |awk -F ‘//‘ ‘{print $1}‘ echo "5.取出http://" echo $var |awk -F ‘www‘ ‘{print $1}‘ echo "6.取出root/123.htm" echo $var |awk -F ‘com/‘ ‘{print $2}‘ echo $var |awk -F ‘/‘ ‘{print $4"/"$5}‘ echo "7.取出123" echo $var |sed ‘s/[^0-9]//g‘ 题目要求请把下面的字符串: zhangsan y97JbzPru lisi 5JhvCls6q xiaowang Nnr8qt2Ma laoma iqMtvC02y zhaosi 9fxrb4sJD 改为如下: zhangsan:y97JbzPru lisi:5JhvCls6q xiaowang:Nnr8qt2Ma laoma:iqMtvC02y zhaosi:9fxrb4sJD 参考答案#!/bin/bash #这个脚本用来格式化文本 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-19 n=`wc -l test3.txt|awk ‘{print $1}‘` n2=$[$n/2] for i in `seq 1 $n2` do i2=$[$i*2] j=$[$i2-1] l1=`sed -n "$i2"p test3.txt` l2=`sed -n "$j"p test3.txt` echo $l2:$l1 done 题目要求linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做练习:
假设有一个大的分区/data/,每次删除文件或者目录之前,都要先在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201703271012/,然后把所有删除的文件同步到该目录下面,可以使用rsync -R 把文件路径一起同步
不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够 参考答案1. 简单 #!/bin/bash #这个脚本用来自定义rm #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-19 filename=$1 big_filesystem=/data/ if [ ! -e $1 ] then echo "$1 不存在,请使用绝对路径" exit fi d=`date +%Y%m%d%H%M` read -p "Are U sure delete the file or directory $1? y|n: " c case $c in y|Y) mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/$1 && /bin/rm -rf $1 ;; n|N) exit 0 ;; *) echo "Please input ‘y‘ or ‘n‘." ;; esac 2.复杂 #!/bin/bash #这个脚本用来自定义rm #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-19 #!/bin/bash filename=$1 if [ ! -e $1 ] then echo "$1 不存在,请使用绝对路径" exit fi d=`date +%Y%m%d%H%M` f_size=`du -sk $1|awk ‘{print $1}‘` disk_size=`LANG=en; df -k |grep -vi filesystem|awk ‘{print $4}‘ |sort -n |tail -n1` big_filesystem=`LANG=en; df -k |grep -vi filesystem |sort -n -k4 |tail -n1 |awk ‘{print $NF}‘` if [ $f_size -lt $disk_size ] then read -p "Are U sure delete the file or directory: $1? y|n: " c case $c in y|Y) mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/$1 && /bin/rm -rf $1 ;; n|N) exit 0 ;; *) echo "Please input ‘y‘ or ‘n‘." ;; esac else echo "The disk size is not enough to backup the files $1." read -p "Do you want to delete $1? y|n: " c case $c in y|Y) echo "It will delete $1 after 5 seconds whitout backup." for i in `seq 1 5`; do echo -ne ". "; sleep 1;done echo /bin/rm -rf $1 ;; n|N) echo "It will not delete $1." exit 0 ;; *) echo "Please input ‘y‘ or ‘n‘." ;; esac fi (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |