zoukankan      html  css  js  c++  java
  • shell中的大括号和小括号

     
    1.shell中的大括号和小括号
     
    1.${var}
    2.$(cmd)
    3.() 和 {}
    4.${var:-string}, ${var:+string},
     ${var:=string}, ${var:?string}
    5.$((exp))
    6.$(var%pattern), $(var%%pattern),
     $(var#pattern), $(var##pattern)
     
    现在分述如下:
    1.${var}是shell中的原形变量,我们常见的形式是
    $var
    如:
    $ var=test
    $ echo $var
    test
    但是这样不能在变量后随意添加字符
    如:
    $varAA
    就会出错
    这时,可以用原形${var}AA
    testAA
    这个特性可以利用来批量修该后缀名
    文件为:rename.sh
    #! /bin/bash
    extension=$1
    for filename in `find . -type f`
    do
    mv $filename ${filename}.$extension
    done
    使用 $ ./rename.sh c可把全部文件修改为.c文件
     
     
    2.$(cmd)是命令替换
    如:
    $ ls 
    d e f
    $ echo $(ls)
    d e f
    这个应该这样理解,先是执行$(ls),这个的标准输出来
    替换$(ls)的位置,作为echo  的参数,即echo d e f
    注:这个和``这个是一致的,看个人习惯了
    有一点是只有标准输出才能被替换,错误输出不能被替换
     
     
    3.() 和 {}
    这两个都是对一串命令的执行,但有些区别
    1.()只是对一串命令重新开一个子进程进行执行
     {}是在当前进程执行
    2.()和{}内的命令都是以;隔开
     ()最后一个命令可以不用分号;
     {}最后一个分号需要
    3.()第一个命令不需要和括号间有空格
     {}第一个命令和左边的括号间有空格
     
    对于1:
    $ var=10
    $ (var=20;echo $var)
    20
    $ echo $var
    10
    说明()中执行的语句没有调用当前的变量,所以是在子进程中实现
     
     
    $ var=30
    $ { var=40;echo $var } #第一个要有空格哦
    40
    $ echo $var
    40
    说明var被修改了,是在同一个进程中实现
     
     
    4.${var:-string}, ${var:+string},
     ${var:=string}, ${var:?string}
     
    A,${var:-string}和${var:=string}
    若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string}
    如:
    $ echo newvar
    $ echo ${newvar:-a}
    a
    $ echo newvar ###变量newvar的值仍然是空,但上一命令行中${newvar:-a}被替换成了a
    $ newvar=b
    $ echo ${newvar:-a} ###变量newvar的值不为空时,此命令行中的${newvar:-b}被替换为$newvar,即b
    b
    $
    对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var:
     
     
    $ echo newvar
    $ echo ${newvar:=a}
    a
    $ echo newvar ###变量newvar被赋值为a,同时${newvar:=a}被替换成a
    a
    $ echo ${newvar:=b} ###变量newvar不为空(其值已被赋为a),则${newvar:=b}被替换为newvar的值(即b)
    a
    $ echo $newvar
    a
    ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
    如设置默认的编辑器:
    PHP 代码:
    echo You use editor: ${EDITOR:=/bin/vi}
    B,${var:+string}
    ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
    $ echo $newvar
    a
    $ echo ${newvar:+b}
    b
    $ echo $newvar
    a
    $ newvar=
    $ echo ${newvar:+b}
    $
    C,${var:?string}
    替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
    $ newvar=
    $ echo ${newvar:?没有设置newvar的值}
    bash: newvar: 没有设置newvar的值
    $ newvar=a
    $ echo ${newvar:?没有设置newvar的值}
    a
    $
    补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
    $ echo ${var:-`date`}
    日 3月 6 02:10:39 CST 2005
    $ echo ${var:-$(date)}
    日 3月 6 02:11:46 CST 2005
    $ a=test
    $ echo ${var:-$a}
    test
    $
    5.POSIX标准的扩展计算:$((exp))
    这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),甚至是三目运算符。
    注意:这种扩展计算是整数型的计算,不支持浮点型.若是逻辑判断,表达式exp为真则为1,假则为0。
    $ echo $((3+2))
    5
    $ echo $((3>2))
    1
    $ echo $((25<3 ? 2:3))
    3
    $ echo $var
    $ echo $((var=2+3))
    5
    $ echo $var
    5
    $ echo $((var++))
    5
    $ echo $var
    6
    $
    好了,上面的例子足够了,这也表明了这种扩展运算是很强大的。
    6.四种模式匹配替换结构:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
    这四种结构的意义是:${var%pattern}和${var%%pattern}表示从最右边(即结尾)匹配的,${var#pattern} 和${var##pattern}从最左边(即开头)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最长匹配。只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分。
    结构中的pattern支持通配符,*表示零个或多个任意字符,?表示零个或一个任意字符,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。
    $ var=aabbbccbbdbb
    $ echo ${var%b}
    aabbbccbbdb
    $ echo ${var%%b}
    aabbbccbbdb
    $ echo ${var#a}
    abbbccbbdbb
    $ echo ${var##a}
    abbbccbbdbb
    $ echo ${var%*b}
    aabbbccbbdb
    $ echo ${var%%*b}
    $ echo ${var#a*}
    abbbccbbdbb
    $ echo ${var##a*}
    $

    各种引号的用法总结如下

    1、 单引号 ‘

    由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。

    2、 双引号 “

    由双引号括起来的字符,除$、、’、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于$来说,就是用其后指定的变量的值来 代替这个变量和$;对于而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加 上的只有四个字符$,,’和”本身。而对”号,若其前面没有加,则Shell会将它同前一个”号匹配。

    3、 反引号 `

    反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

  • 相关阅读:
    java线程——三种创建线程的方式
    java线程——详解Callable、Future和FutureTask
    商品详情页系统的Servlet3异步化实践
    关于servlet3.0中的异步servlet
    Spring中线程池的应用
    Spring中@Async注解实现“方法”的异步调用
    高性能的关键:Spring MVC的异步模式
    SpringBoot+springmvc异步处理请求
    指定Qt程序运行的style,比如fusion(以前没见过QStyleFactory)
    Linux下获取arm的交叉编译工具链
  • 原文地址:https://www.cnblogs.com/youxin/p/3544179.html
Copyright © 2011-2022 走看看