想着将Shell与Python和Java等脚本比较比较,当一有这个念头我就放弃了。这太侮辱Shell了。(哭笑脸!)mysql
做为一个程序员,Linux那是最基本要求。而shell脚本有时候也会显示它在Linux中独特的魅力,让咱们一块儿来学习学习吧!!!!程序员
我爱学习!!sql
案例一shell
打印九九乘法表vim
>循环语句(for)bash
>变量计算(加减乘除)less
语句:学习
1 for i in $(seq 9); do for j in $(seq $i); do echo -n "$i*$j=$(($i*$j)) "; done;echo ""; done
结果:测试
说明:spa
>for循环:for arg in Range;do CMD;done
循环常见场景:
##一、有限数字(用空格隔开)
for i in 1 2 3 4 5;do echo $i ;done
##二、序列数据(seq 开始 步长 最后) ---步长默认1
for i in $(seq 1 3 100); do echo $i ;done
##三、命令结果(默认空格为分隔符)
for i in `cat 01.txt`;do echo $i ;done
for i in `ls | grep "heh"` ;do echo $i ;done
##四、语法循环(相似C,注意为双括号,分号隔开)
for ((i=1;i<3;i+=2));do echo i ;done
for ((;;);do echo"无限循环";done
##五、其余状况
具体状况,具体分析
>算术运算
shell中涉及的算术计算与其余语言同样(或其余语言与shell同样,顺序请强迫症患者忽略),有加(+)、减(-)、乘(*)、除(/)、取模(\)、取余(%)、求幂(**)。
shell中有好几种方法实现运算。
方法一,中括号:[...] ##中括号完成算术执行,需经过"$"引用打印出来
echo $[2+3]
方法二,双小括号:((...)) ##等同于let
echo $((3+2)) ##echo $"let 3+2"
方法三,let、expr表达式
let i= 3+2;echo $i;
echo $(expr $i * 3);(运算符之间要有空格,不然所有不执行运算所有输出)(expr还有其余高级应用,暂且不说)
注意:bash不支持浮点类型计算,以上都只能实现整数运算。浮点的运算须要使用bc/awk
echo 0.5*4-0.2|bc;
echo $(awk 'BEGIN{print 0.5*4-0.2}');
案例二
循环打印日期(可指定起始日期或默认日期),并返回天数
> 循环
>if判断
>date日期
1 #!/bin/bash 2 3 ##判断变量,是否为空(若是没有或只有一个,进行默认赋值) 4 if [ "$1" == "" ] 5 then 6 start_date=`date -d "today last month" "+%Y%m01"` 7 end_date=`date -d "today" "+%Y%m%d"` 8 else 9 if [ "$2" == "" ] 10 then 11 start_date=`date -d "$1" "+%Y%m%d"` 12 end_date=`date -d "today" "+%Y%m%d"` 13 fi 14 fi 15 16 ##判断两个变量是否有问题(可扩展,进行可用性识别) 17 if [ "$start_date" -gt "$end_date" ] 18 then 19 echo "ERROR! \nplease input a right date" 20 exit 21 fi 22 23 ##经过循环,返回日期值(包含开始和结束日期,闭区间) 24 for i in `seq 0 100000` 25 do 26 t_date=`date -d "${start_date} +$(($i+1)) day" "+%Y%m%d"` 27 echo $t_date 28 cnt_days=$i 29 30 ##若是循环到当天,就退出 31 if [ $t_date == $end_date ] 32 then 33 break 34 fi 35 done 36 37 echo "The days between two date is "+$cnt_days+" !"
>if判断
格式:if 条件 ; then cmd ; elif cmd ; else cmd ; fi
条件格式要求:中括号两端有至少一个空格,如 [ **** ] ;判断符中间也须要空格,不然执行虽然不报错但不是咱们要的结果!
经常使用的条件:
数值判断
数字1 -eq 数字2 两数相等为真 (equal)
数字1 -ne 数字2 两数不等为真 (not equal)
数字1 -gt 数字2 数字1大于数字2为真 (great than)
数字1 -ge 数字2 数字1大于等于数字2为真 (great equal)
数字1 -lt 数字2 数字1小于数字2为真 (less than)
数字1 -le 数字2 数字1小于等于数字2为真 (less equal)
文件判断
-e 文件是否存在(目录或普通文件,exists) 【示例:[ -e ./02.txt ] && echo "hehe",这是一种简版的if判断,先执行中括号内部命令,true则执行&&后的命令;】
-f 是否为普通文件 (file)【示例:[ -f ./02.txt ] && echo "heh"】
-d 是否为目录文件(directory)【示例:[ -d ./111 ] && echo "heh"】
-r 文件权限:是否可读(read) 【示例:[ -r ./111 ] && echo "heh"】
-w 文件权限:是否可写(write) 【示例:[ -w ./111 ] && echo "heh"】
-x 文件权限:是否可执行(execute) 【示例:[ -x ./111 ] && echo "heh"】
字符段判断
== 是否相同(测试“=”也能够)【[ "hehe" == "xizao" ] && echo "good"】
!= 是否不等 【[ "hehe" != "xizao" ] && echo "good"】
-z 是否为空(长度是否为0) 【[ -z "" ] && echo "good"】
案例三
对重要的系统数据进行备份,备份周期为一个月(20170901增长)
1 #!/bin/bash 2 3 #备份日期 4 date_log=`date "+%Y%m%d"` 5 6 #加入备份root中的数据 7 tar -czvf /home/shj/bak/root_${date_log}_bak.tar.gz /root 8 9 #删除一个月以前的数据 10 find /home/shj/bak -name "root_*_bak" -mtime +30 -exec rm -rf {} \;
经过crontab -e,作成定时任务每日零点零分执行(假如个人文件名为:shj_bak.sh)
1 #分 时 天 月 周 cmd 2 0 0 * * * sh shj_bak.sh
案例四
今天遇到同事不知道怎么了就把crontab任务删除了,须要进行恢复(20170901)
一、经过cron日志查看有那些任务(若是这些日志在期间内没有执行过,将没法收集)
cat /var/log/cron | grep "shj" | awk -F“(” '{print $3}' | sed 's/(//g' | sort | uniq -c # cat查询数据后以管道符传给grep,匹配shj用户,结果给到awk,“(”做为分隔符,打印第三列,并用sed将“)”替换掉,排序后取出惟一值,并显示执行了多少次。
二、知道了命令和执行次数,就须要考虑执行频率了。找到日志开始时间和结束时间
cat /var/log/cron | grep "shj" | awk '{print $1 " " $2}' | sort | uniq >mytmp
echo "日志开始时间为:`head -1 mytmp`,,结束时间为:`tail -1 mytmp`"
三、重写crontab
案例五
经过shell作hive、MySQL的定时任务。(当前工做很多都是这个)(20170906)
shell写hive的定时任务(路径默认为当前家目录)
一、建立你须要的脚本,例:vim hive_perday.sh
二、编写shell脚本
#!/bin/bash if [ "$1"=="" ] #$1若是不加"",当$1为空会报错。假如这个有个日期参数。 then para1=`date "+%Y&m%d"` else para1=$1 fi #写你的hive语句(假如须要参数) hive_sql="select * from mytable where col>'para1'" #执行你的hive,并将结果输出到指定位置(含错误),将&1替换为/dev/null则不输出错误 hive -e "{$hive_sql}" >~/file 2>&1 #执行hive文件 hive -f hive_file #写入你的MySQL语句 mysql_sql="select * from table where *****" mysql -host10.10.10.10 -utest -p**** -P3306 -e "{$mysql_sql}"
三、将你的脚本部署到定时任务中,若是是长期执行则用crontab,若是只执行一次用at。
案例六
Linux文本处理(今天将csv导入MySQL时,发现多了一列以及表头)。因而,咱们用awk、sed处理一下吧。(20171011补充)
]$ awk -F, '{print $1","$3","$4","$5}' filename >new_file.csv 处理掉多余的列
]$ sed -n '2,$p' new_file.csv > final.csv
]$ mysql -h10.**** -u*** -p****
mysql > load data local infile 'final.csv' insert into table(a,b,c,d);
原创博客,转载请注明出处!欢迎邮件沟通:shj8319@sina.com