想着将Shell与Python和Java等脚本比较比较,当一有这个念头我就放弃了。这太侮辱Shell了。(哭笑脸!)

作为一个程序员,Linux那是最基本要求。而shell脚本有时候也会显示它在Linux中独特的魅力,让我们一起来学习学习吧!!!!

我爱学习!!

案例一

打印九九乘法表

  >循环语句(for)

  >变量计算(加减乘除)

语句:

 for i in $(seq ); do  for j in $(seq $i); do echo -n "$i*$j=$(($i*$j))  "; done;echo ""; done

结果:

说明:

>for循环:for arg in Range;do CMD;done

  循环常见场景:

  ##1、有限数字(用空格隔开)
  for i in 1 2 3 4 5;do echo $i ;done 
  ##2、序列数据(seq 开始 步长 最后) ---步长默认1
  for i in $(seq 1 3 100); do echo $i ;done
  ##3、命令结果(默认空格为分隔符)
  for i in `cat 01.txt`;do echo $i ;done
  for i in `ls | grep "heh"` ;do echo $i ;done
  ##4、语法循环(类似C,注意为双括号,分号隔开)
  for ((i=1;i<3;i+=2));do echo i ;done
  for ((;;);do echo"无限循环";done
  ##5、其他情况
  具体情况,具体分析

>算术运算

  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日期

 #!/bin/bash

 ##判断变量,是否为空(如果没有或只有一个,进行默认赋值)
if [ "$1" == "" ]
then
start_date=`date -d "today last month" "+%Y%m01"`
end_date=`date -d "today" "+%Y%m%d"`
else
if [ "$2" == "" ]
then
start_date=`date -d "$1" "+%Y%m%d"`
end_date=`date -d "today" "+%Y%m%d"`
fi
fi ##判断两个变量是否有问题(可扩展,进行可用性识别)
if [ "$start_date" -gt "$end_date" ]
then
echo "ERROR! \nplease input a right date"
exit
fi ##通过循环,返回日期值(包含开始和结束日期,闭区间)
for i in `seq `
do
t_date=`date -d "${start_date} +$(($i+1)) day" "+%Y%m%d"`
echo $t_date
cnt_days=$i ##如果循环到当天,就退出
if [ $t_date == $end_date ]
then
break
fi
done 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增加)

 #!/bin/bash

 #备份日期
date_log=`date "+%Y%m%d"` #加入备份root中的数据
tar -czvf /home/shj/bak/root_${date_log}_bak.tar.gz /root #删除一个月之前的数据
find /home/shj/bak -name "root_*_bak" -mtime + -exec rm -rf {} \;

  通过crontab -e,做成定时任务每日零点零分执行(假如我的文件名为:shj_bak.sh)

 #分 时 天 月 周 cmd
* * * sh shj_bak.sh

案例四

  今天遇到同事不知道怎么了就把crontab任务删除了,需要进行恢复(20170901)

  1、通过cron日志查看有那些任务(如果这些日志在期间内没有执行过,将无法收集)

    cat /var/log/cron | grep "shj" | awk -F“(” '{print $3}' | sed 's/(//g' | sort | uniq -c  # cat查询数据后以管道符传给grep,匹配shj用户,结果给到awk,“(”作为分隔符,打印第三列,并用sed将“)”替换掉,排序后取出唯一值,并显示执行了多少次。

  2、知道了命令和执行次数,就需要考虑执行频率了。找到日志开始时间和结束时间

    cat /var/log/cron | grep "shj" | awk '{print $1 " " $2}' | sort | uniq  >mytmp

    echo "日志开始时间为:`head -1 mytmp`,,结束时间为:`tail -1 mytmp`"

  3、重写crontab

案例五

  通过shell做hive、MySQL的定时任务。(当前工作不少都是这个)(20170906)

  shell写hive的定时任务(路径默认为当前家目录)

    1、创建你需要的脚本,例:vim  hive_perday.sh

    2、编写shell脚本

#!/bin/bash

    if [ "$1"==""  ]  #$1如果不加"",当$1为空会报错。假如这个有个日期参数。
then
para1=`date "+%Y&m%d"`
else
para1=$
fi #写你的hive语句(假如需要参数)
hive_sql="select * from mytable where col>'para1'"
#执行你的hive,并将结果输出到指定位置(含错误),将&1替换为/dev/null则不输出错误
hive -e "{$hive_sql}" >~/file >&
#执行hive文件
hive -f hive_file #写入你的MySQL语句
mysql_sql="select * from table where *****"
mysql -host10.10.10. -utest -p**** -P3306 -e "{$mysql_sql}"

    3、将你的脚本部署到定时任务中,如果是长期执行则用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

shell实例练习+详解的更多相关文章

  1. [Spark内核] 第36课:TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等

    本課主題 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...

  2. Linux shell tr 命令详解

    该随笔摘自 https://www.jb51.net/article/103892.htm Linux shell tr 命令详解 1. 用途 tr,translate的简写,主要用于压缩重复字符,删 ...

  3. shell字符串操作详解

    shell字符串操作详解的相关资料. 1.shell变量声明的判断  表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...

  4. Android EventBus 3.0 实例使用详解

    EventBus的使用和原理在网上有很多的博客了,其中泓洋大哥和启舰写的非常非常棒,我也是跟着他们的博客学会的EventBus,因为是第一次接触并使用EventBus,所以我写的更多是如何使用,源码解 ...

  5. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  6. Java经典设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  7. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  8. Java设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  9. Java设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...

随机推荐

  1. curl -windows下接口通讯

    1,下载curl -----url命令传输工具 2,配置curl环境变量 3,在cmd环境中使用   举例:curl -G http://xxxxxxx.com?+参数 使用:curl -G &quo ...

  2. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  3. Repair MySQL 5.6 GTID replication by injecting empty transactions

    Since SQL_SLAVE_SKIP_COUNTER doesn’t work with GTID we need to find a way to ignore that transaction ...

  4. visualSVN 版本控制

    用SmartSVN提交代码的时候提示:svn: File has inconsistent newlines 这是由于要提交的文件编码时混合了windows和unix符号导致的. 解决方法: Proj ...

  5. Python 集合 深浅copy

    一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...

  6. xss框架基础框架实现

    0x00web服务器设计 (1)tornado处理请求和Application类要编写一个Tornado应用中最多的工作是定义类继承Tornado的RequestHandler类,主要用于将特定的ur ...

  7. Windows10 环境下安装 ElasticSearch

    环境与版本 操作系统:windows 10 Elasticsearch 版本:6.1.1 Java 版本:9.0.1 ik 分词器版本:6.1.1 安装步骤 前置要求 操作系统中需要安装有 java ...

  8. Android基础_BroadcastReceiver

    一:什么是BroadcastReceiver Broadcast(广播)是一种广泛运用于在应用程序之间一步传播消息的机制系统消息Android系统发出的,电池不足.来电信息等自定义消息第三方应用发出的 ...

  9. python 浅析IO 模型

    协程:遇到IO操作就切换,但是什么时候切回去呢?怎么确定IO操作? 很多程序员可能会考虑使用"线程池"或"连接池"."线程池"旨在减少创建和 ...

  10. java字符串比较

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在j ...