zoukankan      html  css  js  c++  java
  • shell | {}和()

    执行

    bash -n xx.sh用于检测脚本语法是否有错误
    bash -x xx.sh用于追踪执行

    ${var}

    用于限定变量名称的范围,并且支持通配符

    $(cmd)

    shell会先执行括号的cmd,然后将结果作为变量进行替换,替换只能替换标准输出,错误输出不能替换。

    一串命令的()和{}

    • ()是重新开一个子shell然后执行,而{}则是在当前shell里执行。
    • ()最后一个命令可以不用分号,{}最后一个命令要用分号。
    • ()里第一个命令和左边括号不必有空格,而{}第一个命令和左括号之间必须有一个空格。
    • (){}里的某个命令的重定向只影响该命令, 而括号外的重定向则影响到括号里的所有命令。
    root@guo:~/initramfs# var=test
    root@guo:~/initramfs# echo var
    var
    root@guo:~/initramfs# echo $var
    test
    root@guo:~/initramfs# (var=notest;echo $var)
    notest
    root@guo:~/initramfs# {var=notest;echo $var}
    {var=notest: command not found
    test}
    root@guo:~/initramfs# {var=notest;echo $var;}
    -su: syntax error near unexpected token `}'
    root@guo:~/initramfs# { var=notest;echo $var;}
    notest
    root@guo:~/initramfs# echo $var
    notest
    

    从上线可以看出,{}修改了变量的值。表明在当前shell中运行的。

    root@guo:~/initramfs# var=test
    root@guo:~/initramfs# echo $var
    test
    root@guo:~/initramfs# (var=notest;echo $var)
    notest
    root@guo:~/initramfs# echo $var
    test
    

    从上面可以看出()里的执行完毕后没有改变变量的值,说明在子shell中执行的。

    特殊替换

    ${var:-string} 和 ${var:=string}

    当变量var为空或未定义时,则在命令行中用string替换:${var:-string}
    若var不为空时,则用变量var的值,而不进行替换。

    root@guo:~/initramfs/bin# echo $a
    
    root@guo:~/initramfs/bin# echo ${a:-bcc}
    bcc
    root@guo:~/initramfs/bin# echo $a
    
    root@guo:~/initramfs/bin# a=test
    root@guo:~/initramfs/bin# echo ${a:-bcc}
    test
    root@guo:~/initramfs/bin# unset a
    root@guo:~/initramfs/bin# echo $a
    
    root@guo:~/initramfs/bin# echo ${a:=bcc}
    bcc
    root@guo:~/initramfs/bin# echo $a
    bcc
    

    ${var:=string}则是当变量var为空时,则将string赋值给var。

    ${var:+string}

    当var不为空时才替换成string,若var为空,则不替换或替换成var的值,即空

    root@guo:~/initramfs/bin# a=test
    root@guo:~/initramfs/bin# echo $a
    test
    root@guo:~/initramfs/bin# echo ${a:+bcd}
    bcd
    root@guo:~/initramfs/bin# echo $a
    test
    root@guo:~/initramfs/bin# unset a
    root@guo:~/initramfs/bin# echo $a
    
    root@guo:~/initramfs/bin# echo ${a:+bcd}
    
    

    ${var:?string}

    当var不为空时,则用var的值来替换,而当var为空时,则把string输出到STDERR中,并退出脚本。一般用此来检测是否设置了变量的值

    root@guo:~/initramfs/bin# echo $a
    
    root@guo:~/initramfs/bin# echo ${a:?bcd}
    -su: a: bcd
    root@guo:~/initramfs/bin# a=test
    root@guo:~/initramfs/bin# echo ${a:?bcd}
    test
    

    $((exp))

    符合C语言的运算符都在里面进行计算。包括三目运算符,不支持浮点型和字符串,只支持整型计算

    root@guo:~/initramfs/bin# echo $(3+2)
    3+2: command not found
    
    root@guo:~/initramfs/bin# echo $((3+2))
    5
    

    模式替换

    ${var%pattern},${var%%pattern} 从右边开始匹配
    ${var#pattern},${var##pattern} 从左边开始匹配
    ${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪
    ${var%%pattern},${var##pattern} 是最长匹配
    

    只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分
    结构中的pattern支持通配符
    * 表示零个或多个任意字符
    ?表示零个或一个任意字符
    [...]表示匹配中括号里面的字符
    [!...]表示不匹配中括号里面的字符

    root@guo:~/initramfs/bin# f=a.tar.gz
    root@guo:~/initramfs/bin# echo ${f#*.}
    tar.gz  *匹配的a
    root@guo:~/initramfs/bin# echo ${f##*.}
    gz   最长匹配,匹配到了后面的.
    root@guo:~/initramfs/bin# echo ${f%.*}
    a.tar
    root@guo:~/initramfs/bin# echo ${f%%.*}
    a
    

    ==和=

    == 可用于判断变量是否相等,=除了可用于判断变量是否相等外,还可以表示赋值
    (( ))= 表示赋值, == 表示判断(整数比较),它们不等价

    root@guo:~/initramfs/bin# ((n=5))
    root@guo:~/initramfs/bin# echo $n
    5
    root@guo:~/initramfs/bin# ((n==5)) && echo "equal"
    equal
    
  • 相关阅读:
    CF633C Spy Syndrome 2 trie树
    luogu 3998 [SHOI2013]发微博 map
    阿里云ECS新增端口
    阿里云运行docker容器报错
    no matches for kind "ReplicaSet" in version "extensions/v1beta1"
    k8s中flannel:镜像下载不了
    k8s删除节点后再重新添加进去(踩坑)
    如何在IntelliJ Idea中同时启动不同端口
    SpringBoot整合Elastic-job(详细)
    K8S容器探针
  • 原文地址:https://www.cnblogs.com/hbgzy/p/10266847.html
Copyright © 2011-2022 走看看