shell使用点滴

来源:互联网 发布:艾司唑仑片淘宝有卖的 编辑:程序博客网 时间:2024/06/06 06:32

一. 查看当前shell使用的类型

      -- ps 或 echo $SHELL 都可以。注意:SHELL一定要大写

二. 如何运行编写好的shell

      首先cd 到test.sh的目录下,然后  ./test.sh  或者  sh/bash test.sh  或者  chmod +x test.sh,

      如果有参数的话就带上参数 ./test.sh param1 param2 ......

三. 比较常用的shell变量

      $#    --  脚本的参数个数
      $*     --  以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

      $$    --  脚本运行的当前进程ID号

      $!     --  后台运行的最后一个进程的进程ID号

      $@  --  与$*相同,但是使用时加引号,并在引号中返回每个参数

      $<    --  所有的依赖目标集

      $-     --  显示shell使用的当前选项,与set命令功能相同

      $?    --  显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
      $0    --  脚本名称

      $1..$9    --  第N个参数

      $()    --  命令替换,等价于反括号``的作用,能把shell中一个命令的标准输出嵌入到原来的位置

                    详情参考:http://blog.csdn.net/firefoxbug/article/details/7558665

四. shell脚本的第一行中,必须写#!/bin/bash吗?

      ---------------------------------------------------------------------------------------------
      本人初学linux不久,发现在编写脚本的时候开头都有一行#!/bin/sh
      我记得#是表示注释的,那么这一行应该是可以不写的吧?为什么又说“这条语句告诉操作系统用来解释脚本的程序位置。”呢?
      ---------------------------------------------------------------------------------------------
      #!/bin/sh
      表示本脚本由/bin/路径的sh程序来解释....
      跟命令行下~
      #/bin/sh Scriptname效果相同...

      ---------------------------------------------------------------------------------------------
      但是#不是用来表示注释的吗?难道这里的#不是这个意思?
      ---------------------------------------------------------------------------------------------
      不同的地方,#有不同的意思
      就好比c++里面用“//”来注解
      vb里面用“'”注解一样
      dns里面用“;”来注解
      shell的开头那个#不是用来注解的

      ---------------------------------------------------------------------------------------------
      如果你要用给该脚本执行权限的话...第一行必须声明该脚本由什么来解释...
      #的确表示注释.第一行的你只需要知道是声明解释程序的路径就好了 :)
      假如第一行是别的东西.而你又给了x权限,执行的时候就会出错...
      可以不写.执行时手工执行...
      /bin/sh xxxx.sh
      效果是一样的 ...
      ---------------------------------------------------------------------------------------------
      如果不写也成,那就用你登陆的那个shell来解释执行.
      ---------------------------------------------------------------------------------------------
      可以不写,但应该有良好的编程习惯
      ---------------------------------------------------------------------------------------------
      #通常用作注释,但是#!放在一起就标志着这是一个shell script,其后的路径指出了用来解释这个script的程序。
      如果一个script只是一些普通linux指令的堆砌。那么#!可以略去不写。但通常我们遇到的都不是这种情况。
      如果这个script中包含一些自定义的程序组件,比如说函数,变量等,#!便需要标注。

     在shell脚本的开头往往有#!打头的一句话来定义使用哪种sh解释器来解释该脚本。
     目前研发送测的shell脚本中主要有以下两种方式:
     (1) #!/bin/sh
     (2) #!/bin/bash
     在这里求教同福客栈的各位大侠们一个问题:
     以上两种方式有什么区别?对于脚本的实际运行会产生什么不同的影响吗?

     脚本test.sh内容:
     #!/bin/sh
     source pcy.sh #pcy.sh并不存在
     echo hello
     执行./test.sh,屏幕输出为:
     ./test.sh: line 2: pcy.sh: No such file or directory
     由此可见,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
     修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出为:
     ./test.sh: line 2: pcy.sh: No such file or directory
     hello
     由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
     但是紧接着我又试着运行了一下sh ./test.sh,这次屏幕输出为:
     ./test.sh: line 2: pcy.sh: No such file or directory
     表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。

     为什么会有这样的区别呢?

     junru同学作了解释

     1. sh一般设成bash的软链
         [work@zjm-testing-app46 cy]$ ll /bin/sh
         lrwxrwxrwx 1 root     root          4 Nov 13   2006 /bin/sh -> bash
     2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
     3. 也就是说 /bin/sh 相当于 /bin/bash --posix

     所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

     so,可以预想的是,如果第一行写成 #!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,

     有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)


五. shell脚本的比较和逻辑运算符

              1、数值

格式: test "num1" opr "num2"

[ "num1" opr "num2" ]

opr 取值: 相等:-eq                       不等:-ne

        大于:-gt                       小于:-lt  【l是字母L的小写】

        小于等于:-le                大于等于:-ge

2、字符串

格式: [ str1 opr str2]

[ opr str ]

opr取值:相等:=                           不等:!=

      空串:-z                          非空串:-n

3、文件

格式:[ opr file ]

opr取值:目录: -d                        文件: -f

      链接: -L                       可读: -r

      可写: -w                       可执行: -x

      文件非空: -s

4、逻辑运算符

逻辑与: -a          格式: [ condition1 -a condition2 ]

逻辑或: -o          格式: [ condition1 -o condition2 ]

逻辑否: !             格式: [ ! condition ]

      注意:[ 与condition 之间必须有空格,condition与] 之间也必须有空格

      注意:-a -o 用在一个[]中间连接多个条件,而 && || 则用在多个[]之间,连接多个[]条件

      非法:[ condition1 && condition2 ]

六. Makefile中的函数使用

             示例:subst    --  字符串替换函数,用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO

                         $(subst a,the,There is a big tree)    -----    把“There is a big tree”中的“a”替换成“the”,返回结果是“There is the big tree”。

             函数的调用语法
                       函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:$( )  或是  ${ }


                       这里,subst就是函数名,make支持的函数不多。a, the, There is a big tree是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。

                       函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使用变量,为了风格的统一,函数和变量

                       的括号最好一样,如使用“$(subst a,b,$(x))”这样的形式,而不是“$(subst a,b,${x})”的形式。因为统一会更清楚,也会减少一些不必要的麻烦。

 

             详见: http://blog.csdn.net/ljzcom/article/details/7886909

七.  

 


 

原创粉丝点击