zoukankan      html  css  js  c++  java
  • bash shell笔记1 脚本基础知识

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://twentyfour.blog.51cto.com/945260/505644

    ****shell 脚本基础知识****
    ##########实验环境是RHEL5.3,内核2.6.18###########
    一、基本脚本编译
    知识内容:
    # 构建脚本
    # 将命令串联起来
    # 存储变量
    # 数学计算
    # 重定向输出
    # 检查代码

    1、使用多条命令
    shell不像高级语言需要编译后执行,而是直接处理每一条命令,可以将多条命令连接起来形成单一的步骤。
    如下使用两个bash shell命令,则为一个最简单的shell脚本啦:
    [root@wzp ~]# who ; date
    root     :0           2010-12-13 09:29
    root     pts/0        2011-01-27 15:12 (:0.0)
    2011年 01月 27日 星期四 15:26:42 CST
    但如上存在缺点,必须在提示符输入整条命令,所以可以将命令合并到一个文件中,当需要运行命令的时候运行文本文件就行了。
    2、创建脚本文件
    [root@wzp ~]# cat test1 
    #!/bin/bash
    date
    who
    通过创建编辑test1文件,具体内容如上
    #!/bin/bash指明了该文件所使用的shell
    [root@wzp ~]# ls -l test1 
    -rw-r--r-- 1 root root 21 01-27 15:30 test1
    [root@wzp ~]# ./test1
    bash: ./test1: 权限不够
    如果直接运行该文件是无法执行的,因为shell脚本文件所在目录没添加到PATH环境变量中,我们可以通过echo $PATH查看。这里我们可以使用单点操作符。
    [root@wzp ~]# chmod u+x test1 
    [root@wzp ~]# ./test1 
    2011年 01月 27日 星期四 15:32:23 CST
    root     :0           2010-12-13 09:29
    root     pts/0        2011-01-27 15:12 (:0.0)
    3、显示消息
    [root@wzp ~]# echo welcome to 24 blog
    welcome to 24 blog
    如上正常显示
    [root@wzp ~]# echo welcome to 24' blog
    > 
    如上字符出现单引号,则无法显示
    [root@wzp ~]# echo "welcome to 24' blog"
    welcome to 24' blog
    通过外围添加双引号使得正常显示
    [root@wzp ~]# echo 'welcome to "51cto" website'
    welcome to "51cto" website
    所以说在shell脚本中需要用到echo显示消息时注意单引号和双引号问题。
    [root@wzp ~]# cat test1 
    #!/bin/bash
    echo -n "today is : "
    date
    echo "who logined this os :"
    who
    上面使用-n 参数可以使得echo命令结果和文本字符串在同一行
    [root@wzp ~]# ./test1 
    today is : 2011年 01月 27日 星期四 15:49:08 CST
    who logined this os :
    root     :0           2010-12-13 09:29
    root     pts/0        2011-01-27 15:12 (:0.0)
    4、使用变量
    4.1 环境变量
    可以通过set命令显示活动环境变量的完整列表,如下通过echo单独显示一些$开头的变量:
    [root@wzp ~]# echo $LANG
    zh_CN.UTF-8
    [root@wzp ~]# echo $USER
    root
    [root@wzp ~]# echo $LANG
    zh_CN.UTF-8
    [root@wzp ~]# echo $UID
    0
    [root@wzp ~]# echo $HOME
    /root
    如上可以看到我用的是root账号,还有字符编码类型,家目录
    [root@wzp ~]# cat test1 
    #!/bin/bash
    echo user info for userid: $USER
    echo UID: $UID
    echo HOME DIR : $HOME
    echo LANG : $LANG
    [root@wzp ~]# ./test1 
    user info for userid: root
    UID: 0
    HOME DIR : /root
    LANG : zh_CN.UTF-8
    如上可以总结出:使用美元符号开头的环境变量可以从脚本中引进这些环境变量
    但是,当我们只想要使用$符号的时候呢?怎么显示:
    [root@wzp ~]# echo $HOME
    /root
    [root@wzp ~]# echo /$HOME
    //root
    [root@wzp ~]# echo $HOME
    $HOME
    上面的例子可以看出使用反斜杠,那么shell脚本则将美元符号翻译成$,而不再是一个变量了,这点容易懂!
    4.2用户变量
    shell允许在脚本中设置和使用自己的变量,用户变量区分大小写,通过等号赋值给用户变量(=两边不准有空格)跟系统变量一样,用户变量也可以使用$引用:
    [root@wzp ~]# cat test1 
    #!/bin/bash
    days=10
    xxx1=ftp
    echo $xxx1 is 文件传输协议
    xxx2=http
    echo $xxx2 is 超文本标记传输协议 
    [root@wzp ~]# ./test1 
    ftp is 文件传输协议
    http is 超文本标记传输协议
    4.3反引号
    `这个符号就是反引号,在shell脚本之外很少使用它(处于键盘的1号键左边)反引号允许将shell命令的输出赋值给变量,在脚本编程中,它是主要的构建。如下例:
    [root@wzp ~]# cat test1 
    #!/bin/bash
    testing=`date`
    echo the date and the time are : $testing
    [root@wzp ~]# ./test1 
    the date and the time are : 2011年 01月 27日 星期四 20:13:17 CST
    如果上例没有使用反引号,那么现实的内容就是date这个字符而已了!
    再来一个现实比较常用的例子:
    [root@wzp ~]# cat test1 
    #!/bin/bash
    testing=`date +%y%m%d`
    ls /usr/bin -al > log.$testing
    如上date +%y%m%d表示显示date命令的年月日,然后把$testing变量的值作为文件名,并且把/usr/bin下的文件目录都重定向到生产的文件中。(重定向下面会讲述)
    [root@wzp ~]# ./test1 
    [root@wzp ~]# ll log.110127 
    -rw-r--r-- 1 root root 97764 01-27 20:18 log.110127
    这样就很方便了,每天的日志文件自动区分出来,实现自动化!
    5、重定向输入输出
    有时候想通过命令保存输出,而不是显示在屏幕上,重定向就可以解决这个问题。
    5.1、输出重定向
    意思是说通过一条命令把显示的内容发送到文件中,通过>大于号实现,例子:
    [root@wzp ~]# date > test1 
    [root@wzp ~]# cat test1 
    2011年 01月 27日 星期四 20:26:08 CST
    [root@wzp ~]# who > test1 
    [root@wzp ~]# cat test1 
    root     :0           2011-01-27 20:07
    root     pts/0        2011-01-27 20:10 (:0.0)
    这个好理解,不多说。
    5.2、输入重定向
    输入重定向是输出重定向的相反过程,把一个文件的内容重定向到一个命令中,如:
    [root@wzp ~]# cat test1 
    2011年 01月 27日 星期四 20:29:15 CST
    [root@wzp ~]# wc < test1 
      6 43
    通过将文本文件重定向到wc命令中,可以算出这个文件的行数、单词数、字节数。
    如上表示test1文件有1行、6个单词和43个字节,这个很好懂吧!
    5.3追加  
    重定向的作用是完全覆盖,追加的概念就是在原本文件内容基础上添加,如:
    [root@wzp ~]# cat test1 
    2011年 01月 27日 星期四 20:29:15 CST
    [root@wzp ~]# cal >> test1 
    [root@wzp ~]# cat test1 
    2011年 01月 27日 星期四 20:29:15 CST
         一月 2011      
    日 一 二 三 四 五 六
                       1
      8
     9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30 31
    通过>>符号实现追加,可以看到date显示的内容还是没丢失。
    6、管道
    通过|这个符号实现管道过滤作用,这个很容易理解,比如在查看一些服务或者开放的端口,就可以通过管道过滤出我们想到查看的东西,而不是全部显示出来!
    [root@wzp ~]# rpm -qa |grep http
    httpd-2.2.3-22.el5
    httpd-manual-2.2.3-22.el5
    httpd-devel-2.2.3-22.el5
    [root@wzp ~]# netstat -antup |grep http
    tcp            0 :::80                       :::*                        L:ISTEN      4124/httpd          
    tcp            0 :::443                      :::*                        LISTEN      4124/httpd   
    这个就不多说了!
    7、数学计算
    处理数学的能力是编程语言至关重要的,可惜shell这方面不是很好。简单说说~
    7.1、expr命令
    expr命令可以处理命令行中的等式,在RHEL5.3下:
    [root@wzp ~]# expr 2*5
    2*5
    [root@wzp ~]# expr 2 * 5
    expr: 语法错误
    [root@wzp ~]# expr 2 * 5
    10
    这样子在shell命令中使用expr命令就显得麻烦了。
    如下通过使用括号改进这个措施.
    7.2使用括号
    看下面这个例子,完全就是可以通过[]或者()替代了expr
    [root@wzp ~]# wzp1=$[1+5]
    [root@wzp ~]# echo $wzp1
    6
    先赋值,然后显示变量值。继续看看一个例子:
    [root@wzp ~]# cat test1 
    #!/bin/bash
    var1=100
    var2=50
    var3=45
    var4=$[$var1 * ($var2 - $var3)]
    echo the final result is $var4
    [root@wzp ~]# ./test1 
    the final result is 500
    通过[()]非常灵活的解决数学计算问题。当然,bash shell只是解决了整数运算。
    对于浮点算术运算,出现小数点的情况又是如何呢?
    7.3浮点解决方案
    首先看看一个例子:
    [root@wzp ~]# cat test1 
    #!/bin/bash
    var1=100
    var2=45
    var3=$[$var1 / $var2]
    echo the final result is $var3
    [root@wzp ~]# ./test1 
    the final result is 2
    我们可以看到,计算结果余数被忽略了,只是留下商。
    shell脚本可以通过使用Z shell(zsh)解决浮点算术运算,当然bash shell可以通过使用内置的bash计算器(称为bc)解决浮点运算问题。
    这里长话短说,直接在脚本用使用bc,具体要用到的时候在找解决方法。
    先看下面一个例子:
    [root@wzp ~]# cat test1 
    #!/bin/bash
    var1=100
    var2=45
    var3='echo "scale=4; $var1 / $var2" | bc'
    echo the answer is $var3
    [root@wzp ~]# sh test1 
    the answer is echo "scale=4; $var1 / $var2" | bc
    不知道为何,参加资料可以实现,我这里一直搞不定!先放着!!
    自己猜测应该是linux发行版问题~~~
    8、退出脚本
    每条运行在shell中的命令都使用一个退出状态,不过这点比较少弄,这个退出状态时一个介于0到255之间的数据,这个稍微了解下就行了!
    8.1、核对退出状态
    linux提供了 $? 这个特殊变量来保存最后一条命令执行结束的退出状态
    先看个例子:
    [root@wzp ~]# date
    2011年 01月 27日 星期四 22:39:58 CST
    [root@wzp ~]# echo $?
    0
    [root@wzp ~]# wzp
    bash: wzp: command not found
    [root@wzp ~]# echo $?
    127
    从上面看到date这个有效命令的退出状态值是0,而wzp这个无效命令的值是127
    具体还有其他退出状态值的数,可以自行参考下linux退出状态代码
    8.2退出命令
    在shell文本脚本中,可以自行设置退出状态值
    [root@wzp ~]# cat test1 
    #!/bin/bash
    date
    exit 5
    [root@wzp ~]# ./test1 
    2011年 01月 27日 星期四 23:13:42 CST
    [root@wzp ~]# echo $?
    5
    这个效果具体作用后续用到再说说了,这里点到为止了!
     

    本文出自 “twenty_four” 博客,请务必保留此出处http://twentyfour.blog.51cto.com/945260/505644

     

    下面是我个人跟这代码:

     

    bash <wbr>shell笔记1 <wbr>脚本基础知识
    运行结果如下图:
    bash <wbr>shell笔记1 <wbr>脚本基础知识


  • 相关阅读:
    《孙子兵法》(前六篇)读书笔记
    写代码的指导思想:如何写出易测、清晰、健壮的牢固代码
    如何从业务代码中抽离出可复用的微组件
    碎碎念集萃二八
    订单同步工程标准化改造事记
    代码的味道
    批量导出51电子发票的pdf文件
    LODOP具体的分类的简短问答
    lodop打印透明图简短问答
    LODOP打印公章的白色透明2
  • 原文地址:https://www.cnblogs.com/songfeixiang/p/3733762.html
Copyright © 2011-2022 走看看