高级bash脚本编程(1)

前端之家收集整理的这篇文章主要介绍了高级bash脚本编程(1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

知识点

compound 和 comparison

  • -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真。

  • -o 逻辑或 exp1 -o exp2 如果表达式 exp1 和 exp2 中至少有一个为真的话,那么结果为真。

  • 注意:这与Bash中的比较操作符 && 和 || 非常相像,但是这个两个操作符是用在双中括号结构中的。
  • [[ condition1 && condition2 ]]

  • -o和-a操作符一般都是和test命令或者是单中括号结构一起使用的
  • if [ "\(exp1" -a "\)exp2" ]

操作符

@H_301_30@
  • 赋值
    • var=27 注意:在"="之后是不允许出现空白字符,不要混淆= 赋值操作符与 = (有空格)测试操作符
    @H_301_30@
  • 算术操作符
      • 加法计算
      • 减法计算
      • 乘法计算
    • / 除法计算
    • ** 幂运算
    • % 模运算,或者是求余运算(返回一次除法运算的余数)
    @H_301_30@
  • 位操作符
    • << 左移一位(每次左移都相当于乘以2)

    • <<= “左移-赋值”
    • let "var <<= 2" #这句的结果就是变量var左移2位(就是乘以4)

    • >> 右移一位(每次右移都将除以2)

    • >>= “右移-赋值”(与<<=正好相反)

    • & 按位与

    • &= “按位与-赋值”

    • | 按位或

    • |= “按位或-赋值”

    • ~ 按位反

    • ! 按位非

    • ^ 按位异或XOR

    • ^= “按位异或-赋值”
    @H_301_30@
  • 逻辑操作符
    • 使用&&和||进行混合条件测试
    • 双中括号的if-test结构要比单中括号的if-test结构更加灵活.
    @H_301_30@
  • 其他混杂的操作符
    • ,逗号操作符可以连接两个或多个算术运算。所有的操作都会被运行(可能会有负作用),但是只会返回最后操作的结果。

      变量

    @H_301_30@
  • 内置变量
    • $BASH Bash的二进制程序文件的路径(脚本解释器的路径)
    • $FUNCNAME 当前函数的名字
    • $IFS 内部域分隔符,这个变量用来决定 Bash 在解释字符串时如何识别域,或者单词边界。
    • \(REPLY 当没有参数变量提供给 read 命令的时候,这个变量会作为默认变量提供给 read 命令。也 可以用于 select 菜单,但是只提供所选择变量的编号,而不是变量本身的值。在个别版本的bash中,并不支持内置变量\)REPLY。
    • 通过$*和$@列出所有的参数,"$" 所有的位置参数都被看作为一个单词。$@与$相同,但是每个参数都是一个独立的引用字符串,这就意味着,参数是被完整 传递的,并没有被解释或扩展。这也意味着,参数列表中每个参数都被看作为单独的单词。

    操作字符串

    @H_301_30@
  • 字符串长度
    • echo ${#stringZ}
    • expr length $stringZ
    @H_301_30@
  • 使用awk来处理字符串
    • 提取字符串
    • echo | awk ' { print substr("'"${String}"'",3,4) # skid } '
    • 等价于echo ${String:2:4} # 位置 3 (0-1-2),4 个字符长

    参数替换

    @H_301_30@
  • 处理和拓展变量
    • ${parameter-default} 如果变量 parameter 没被声明,那么就使用默认值。
    • ${parameter:-default} 如果变量 parameter 没被设置,那么就使用默认值。
    • ${parameter=default} 如果变量parameter没声明,那么就把它的值设为default。
    • ${parameter:=default} 如果变量parameter没设置,那么就把它的值设为default。
    • ${parameter+alt_value} 如果变量parameter被声明了,那么就使用alt_value,否则就使用null字符串。
    • ${parameter:+alt_value} 如果变量parameter被设置了,那么就使用alt_value,否则就使用null字符串。
    • ${parameter?err_msg} 如果parameter已经被声明,那么就使用设置的值,否则打印err_msg错误消息。
    • ${parameter:?err_msg} 如果parameter已经被设置,那么就使用设置的值,否则打印err_msg错误消息。
    @H_301_30@
  • 变量长度/子串删除
    • \({#var} 字符串长度(变量\)var得字符个数)。对于array来说,${#array}表示的是数组中第一个元素的长度.
    • ${var#Pattern},\({var##Pattern} 从变量\)var的开头删除最短或最长匹配$Pattern的子串。 “#”表示匹配最短,“##”表示匹配最长
    • ${var%Pattern},\({var%%Pattern} 从变量\)var的结尾删除最短或最长匹配$Pattern的子串。 “%”表示匹配最短,“%%”表示匹配最长。
    @H_301_30@
  • 变量拓展/子串替代
    • ${var:pos} 变量var从位置pos开始扩展, 也就是pos之前的字符都丢弃。
    • ${var:pos:len} 变量var从位置pos开始,并扩展len个字符。
    • ${var/Pattern/Replacement} 使用Replacement来替换变量var中第一个匹配Pattern的字符串。
    • ${var//Pattern/Replacement} 全局替换。所有在变量var匹配Pattern的字符串,都会被替换为Replacement。
    • ${var/#Pattern/Replacement} 如果变量var的前缀匹配Pattern,那么就使用Replacement来替换匹配到Pattern的字符串。
    • ${var/%Pattern/Replacement} 如果变量var的后缀匹配Pattern,那么就使用Replacement来替换匹配到Pattern的字符串
    • t=${var1#*-} 也一样,
    • 因为#匹配最短的字符串,
    • 同时*匹配任意前缀,包括空字符串.

      指定变量的类型

    @H_301_30@
  • declare/typeset选项
    -r 只读
    -i 整型
    -a 数组
    -f 函数
    -x export

    变量的间接引用

  • 间接引用
    • 假设一个变量的值是第二个变量的名字。如果a=letter_of_alphabet并且letter_of_alphabet=z, 它被称为间接引用。我们能够通过引用变量a来获得z,它使用eval var1=$$var2这种不平常的形式。
    • eval a=$$a
  • 传递一个间接引用给awk
    多行的awk脚本的调用方法为: awk ' ..... '
    ```
    awk脚本开始.
    ------------------------------------------------
    awk "

  • { total += $${column_number} # 间接引用
    }
    END {

    print total
    }

    " "$filename" ------------------------------------------------
    awk脚本结束.

    ```

    双圆括号结构

    与let命令很相似,((...)) 结构允许算术扩展和赋值。 如,a=$(( 5 + 3 )),将把变量“a”设为“5 + 3”,或者8;(( a = 23 )) .

    实验截图

    3-1:


    3-2:


    3-2调试

    3-3:


    3-4:


    3-5


    3-6

    猜你在找的Bash相关文章