zoukankan      html  css  js  c++  java
  • bash 括号(小括号,双小括号,中括号,双中括号,大括号)

    小括号()和大括号{}

    主要包括一下几种

    • ${var} 
    • $(cmd) 
    • ()和{} 
    • $((exp)) 
    • ${var:-string},${var:+string},${var:=string},${var:?string} 
    • $(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)

    1.shell变量应用原型 ${var}

    2.变量替换 ${cmd}与`cmd`类似

    注意:$(cmd)只输出标准输入,如果命令执行错误,则无输出

    3. 一串命令执行 ()和{},

        二者都用于执行一串命令,指令之间用;分开,注意:括号内的数据重导向只影响括号内部的指令输入输出,不影响括号外部的指令

        不同之处如下:

        运行方式:

    1)()重新开启一个shell运行命令,{}在当前shell运行

    2)()最后一条指令不需要; , {}最后一条指令需要;

    3)  {}第一个指令和左括号需要有空格,()不需要

    下面是一个简单的例子  

     1 $ var=test 
     2 $ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效 
     3 notest 
     4 $ echo $var ###父shell中值仍为test 
     5 test 
     6 $ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格 
     7 notest 
     8 $ echo $var ###父shell中的var变量的值变为了notest 
     9 notest 
    10 $ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重定向到文件a中, 
    11 test2 ###而test2输出则仍输出到标准输出中。 
    12 $ cat a 
    13 test1 
    14 $ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的标准输出全部被重定向到文件a中 
    15 $ cat a 
    16 test1 
    17 test2

    4.$((expr))用于执行数学运算,语法类似c语言

       例子如下

     1 $ echo $((3+2)) 
     2 5 
     3 $ echo $((3>2)) 
     4 1 
     5 $ echo $((25<3 ? 2:3)) 
     6 3 
     7 $ echo $var
     8  
     9 $ echo $((var=2+3)) 
    10 5 
    11 $ echo $var 
    12 5 
    13 $ echo $((var++)) 
    14 5 
    15 $ echo $var 
    16 6 
    17 $

    在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算。估计很多朋友都感觉比较难以接受。特变逻辑运算符”[]”使用时候,必须保证运算符与算数 之间有空格。 四则运算也只能借助:let,expr等命令完成。 今天讲的双括号”(())”结构语句,就是对shell中算数及赋值运算的扩展。

    使用方法:

    语法:

    ((表达式1,表达式2…))

    特点:

    1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。

    2、在双括号结构中,所有变量可以不加入:“$”符号前缀。

    3、双括号可以进行逻辑运算,四则运算

    4、双括号结构 扩展了for,while,if条件测试运算

    5、支持多个表达式运算,各个表达式之间用“,”分开

    使用实例:

    • 扩展四则运算
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
     
    a=1;
    b=2;
    c=3;
     
    ((a=a+1));
    echo $a;
     
    a=$((a+1,b++,c++));
    echo $a,$b,$c

    运行结果:

    sh testsh.sh
    2
    3,3,4

    双括号结构之间支持多个表达式,然后加减乘除等c语言常用运算符都支持。如果双括号带:$,将获得表达式值,赋值给左边变量。

    • 扩展逻辑运算
     
    #!/bin/sh
    a=1;
    b="ab";
    echo $((a>1?8:9));
    ((b!="a"))&& echo "err2";
    ((a<2))&& echo "ok";

    运行结果:

    sh testsh.sh
    9
    err2
    ok

    • 扩展流程控制语句(逻辑关系式)
     
    #!/bin/sh
    num=100;
    total=0;
    for((i=0;i<=num;i++));
    do
        ((total+=i));
    done
    echo $total;
     
    total=0;
    i=0;
    while((i<=num));
    do
        ((total+=i,i++));
    done
    echo $total;
     
    if((total>=5050));then
        echo "ok";
    fi

    运算结果:

    sh testsh.sh
    5050
    5050
    ok

    有了双括号运算符:[[]],[],test 逻辑运算,已经let,expr 都可以抛到一边了。

    5. ${var: } ,${var%}用于变量的替换和匹配替换结构

    替换:

    ${var:-string} 若var为空,${var:-string}值为string  

    ${var:=string} 与${var:-string}功能类型,不过${var:=string} 将string值赋给var变量

    ${var:=string} 判断某个变量是否赋值,没有的话则给它赋上一个默认值  

    ${var:+string}的替换规则和${var:=string}相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值

    匹配:

    ${var%pattern}和${var%%pattern}表示从最右边(即结尾)匹配的

    ${var#pattern} 和${var##pattern}从最左边(即开头)匹配的

    中括号[] [[]]

    一.   bash [  ] 单双括号

    基本要素:

    Ø  [ ] 两个符号左右都要有空格分隔

    Ø  内部操作符与操作变量之间要有空格:如  [  “a”  =  “b”  ]

    Ø  字符串比较中,> < 需要写成> < 进行转义

    Ø  [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,避免值未定义引用而出错的好办法

    Ø  [ ] 中可以使用 –a –o 进行逻辑运算

    Ø  [ ] 是bash 内置命令:[ is a shell builtin

    二.bash  [[  ]] 双方括号

    基本要素:

    Ø  [[ ]] 两个符号左右都要有空格分隔

    Ø  内部操作符与操作变量之间要有空格:如  [[  “a” =  “b”  ]]

    Ø  字符串比较中,可以直接使用 > < 无需转义

    Ø  [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配

    [root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"

      ok

    Ø  [[] ] 内部可以使用 &&  || 进行逻辑运算

    Ø  [[ ]] 是bash  keyword:[[ is a shell keyword

    [[ ]] 其他用法都和[ ] 一样

    Ø  [[ ]] 和 [ ] 都可以和 ! 配合使用

    优先级 !  >  && > || 

    逻辑运算符  < 关系运算符

    逻辑运算符  : !  &&  || -a  -o

    关系运算符  : <  >  > <  ==  = !=  – eq –ne  -gt -ge  –lt  -le

    -----------------------------------------------------------------------------

    n  [[  ]] 比[ ] 具备的优势

    -----------------------------------------------------------------------------

        ①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

        ②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

        ③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

        ④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

    使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。

    参考:https://blog.csdn.net/claytonzeng/article/details/10267225

    参考:https://blog.csdn.net/DLUTBruceZhang/article/details/9230757

  • 相关阅读:
    抓取六房间小姐姐小视频
    fiddler报错:creation of the root certificate was not successful 证书安装不成功
    修改cmd命令默认路径
    二维码的生成
    大话设计模式Python实现-单例模式
    大话设计模式Python实现-迭代器模式
    大话设计模式Python实现-组合模式
    大话设计模式Python实现-备忘录模式
    大话设计模式Python实现-适配器模式
    大话设计模式Python实现-状态模式
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/10020697.html
Copyright © 2011-2022 走看看