-
shell中的大括号,小括号语法分别概述转载自 http://www.2cto.com/os/201308/235084.html1.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 $vartest但是这样不能在变量后随意添加字符如:$varAA就会出错这时,可以用原形${var}AAtestAA这个特性可以利用来批量修该后缀名文件为:rename.sh#! /bin/bashextension=$1for filename in `find . -type f`domv $filename ${filename}.$extensiondone使用 $ ./rename.sh c可把全部文件修改为.c文件2.$(cmd)是命令替换如:$ lsd 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 $var10说明()中执行的语句没有调用当前的变量,所以是在子进程中实现$ var=30$ { var=40;echo $var } #第一个要有空格哦40$ echo $var40说明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,即bb$对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var:$ echo newvar$ echo ${newvar:=a}a$ echo newvar ###变量newvar被赋值为a,同时${newvar:=a}被替换成aa$ echo ${newvar:=b} ###变量newvar不为空(其值已被赋为a),则${newvar:=b}被替换为newvar的值(即b)a$ echo $newvara${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。如设置默认的编辑器:PHP 代码:echo You use editor: ${EDITOR:=/bin/vi}B,${var:+string}${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)$ echo $newvara$ echo ${newvar:+b}b$ echo $newvara$ 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 $var5$ echo $((var++))5$ echo $var6$好了,上面的例子足够了,这也表明了这种扩展运算是很强大的。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*}$
shell中的大括号,小括号语法分别概述
最新推荐文章于 2025-04-21 20:41:39 发布