• [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];使用竖杠符号“|”表示或。

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

     
     
  • 相关阅读:
    编程能力与编程年龄
    编程能力与编程年龄
    通俗易懂,一篇文章告诉你编程语言是个啥?
    通俗易懂,一篇文章告诉你编程语言是个啥?
    进程与线程的区别:最浅显易懂的解释
    进程与线程的区别:最浅显易懂的解释
    为什么超 80% 的开源开发者苦苦挣扎在贫困线?
    java之异常处理
    33_java之类加载器和反射
    32_java之TCP和UDP
  • 原文地址:https://www.cnblogs.com/NightPxy/p/9188226.html
Copyright © 2020-2023  润新知