[Linux]-Shell编程与规范

1.脚本文件

  Shell脚本一般以.sh为后缀名.但注意在Linux中.sh不是作为文件类型识别的依据,仅仅只是用来向看到的人标记这是一个Shell脚本而已.

  Shell脚本一般有一个头声明 #!/bin/bash  告诉Linux应该用什么来执行脚本,如果没有,Linux默认将使用bash来执行脚本

2.脚本的执行方式

  source  [文件名]

  .  [文件名]

  ./  [文件名]  (注意这种方式文件需要有执行权限)

  bash/dash/sh    [文件名]

3.管道符

  管道符 | :将上一个命令的执行结果作为下一个命令的参数传入.这是一个非常有用的使用

  一个使用率非常的高的语句 ps *** | grep 'xxxx' 就是一个管道符的最好例子. 这句话的本意是 执行ps **** ,并在返回结果再执行过滤 'xxxx'

4.重定向

  Linux标准是由输入设备(键盘)获取输入,将结果输出到输出设备(屏幕).重定向就是这个输入输出的转向

  4.1 标准重定向

    输入重定向

      < 输入重定向

      例 wc < file 对file文件的内容进行单词计数.

    输出重定向

      >输出重定向(以覆盖方式)  >>输出重定向(以追加方式)   

      例: ls > file 将ls的执行结果放入file文件中(ls的输出本来是屏幕,输出重定向到文件)

    &> 混合输出

  4.2 签入文档重定向

    <<delimiter delimiter   将delimiter之间的内容作为输入传入给前面的命令

    例:$wc -l << EOF

      xxx

     EOF

  4.3 黑洞重定向

    command /dev/null

    /dev/null是Linux定义的一个特殊的存在.所有向它写入的东西将全部消失,所有向它读取的东西将什么也读不到,所以称之为黑洞.

5.变量

  5.1 自定义变量

    5.1.1 变量的声明

      shell中变量区分大小写,可以以字母或者下划线开头.规范是系统变量全大写,自定义变量纯小写,以下划线分割

      注意:shell中定义变量temp=1,=前后不能有空格.

    5.1.2 变量的作用范围(局部&全局)

      export 声明: export是将声明的变量由局部变量升级为全局变量.默认情况下声明的变量只会在当前运行的shell环境有效,export后变量可以再进入新的shell环境后依然有效

  5.2 预定义变量

    由bash预先定义的一些特殊变量,可以直接使用但不能修改

      $$ 当前脚本执行的进程ID

      $0 当前脚本的文件名

      $n(1-9) 执行脚本传入的第n个参数    

      $# 执行脚本传入的参数的格式

      $*  执行脚本传入的所有参数 当被双引号包裹时,$*将所有参数作为一个整体输出 " a b c d"

      $@ 执行脚本传入的所有参数 当被双引号包裹时,$@将所有参数分开作为个体输出  "a" "b" "c" "d"

      $? 上个命令的退出状态或者函数执行的返回值

  5.3 变量的数学运算

    变量的数学计算不能直接使用. A+B在shell中的含义是A和B两个作为字符串拼接.

    数学计算需要使用 expr 关键字

      expr [变量] [运算符]  [变量2]   <=注意,运算符的前后必须有空格

      例子: c=`expr $x + $y` 

6.流程控制

  6.1 if 语句

    6.1.1 语法    

        if [[ 条件 ]];then
            ...
        elif [[ 多个条件 ]];then
            ...
        else
            ...
        fi
  6.1.2 条件符

     数值比较
        -eq 测试两个整数是否相等
       -ne 测试两个整数是否不等
-gt 测试一个数是否大于另一个数
-lt 测试一个数是否小于另一个数
-ge 大于或等于
-le 小于或等于

字符串比较

                          [ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
                            [ -n STRING ] 如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真;
                            [ STRING1 = STRING2 ] 如果两个字符串相同则为真 ;
                            [ STRING1 != STRING2 ] 如果字符串不相同则为真 ;
                            [ STRING1 ]  如果字符串不为空则为真,与-n类似

        文件&文件夹&目录比较        
                         [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
                           [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
                           [ -d DIR ] 如果 FILE 存在且是一个目录则为真。
                           [ -e FILE ] 如果 FILE 存在则为真。
                           [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
                           [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
                           [ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
                           [ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
                           [ -r FILE ] 如果 FILE 存在且是可读的则为真。
                           [ -s FILE ] 如果 FILE 存在且大小不为0则为真。
                           [ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
                           [ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
                           [ -w FILE ] 如果 FILE存在且是可写的则为真。
                           [ -x FILE ] 如果 FILE 存在且是可执行的则为真。
                           [ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
                           [ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
                           [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
                           [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
                           [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
                           [ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
                           [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
                           [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
  6.2 while 语句
    6.2.1 语法
      while argument;
      do
        .....
      done
    6.2.2 例子     
         COUNTER=0
         while [ $COUNTER -lt 5 ]
         do
            COUNTER='expr $COUNTER+1'
            echo $COUNTER
         done

         while read text
         do
             echo ${text}
         done < /home/infile
  6.3 case 语句
    6.3.1 语法
      case $变量名 in

                    模式1)

                ....

              ;;

                 模式2)

                ....

            ;; 

                 *)

                .....     

     ;; 

              esac

      case行尾必须为单词“in”,每一个模式必须以右括号“)”结束。

            双分号“;;”表示命令序列结束。

            匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。

            最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后的命令序列。

 
 
posted @ 2018-06-15 17:14  NightPxy  阅读(181)  评论(0编辑  收藏  举报