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首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

shell中的大括号和小括号的更多相关文章

  1. shell编程中的单/双 小括号, 中括号, 大括号

    linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...

  2. shell -- 大括号和小括号

    在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string ...

  3. Html.Action Html.RenderAction Html.Partial Html.RenderPartial Url.Action Html.ActionLink 大括号和小括号区别

    在查阅了一些资料后,结论如下: Action 是以mvchtmlstring的方式返回一个结果,RenderAction 无返回值,速度上action慢于RenderAction partial和Re ...

  4. Linux Shell脚本攻略:shell中各种括号()、(())、[]、[[]]、{}的作用

    技巧小结: 字符串比较用双中括号[[ ]]:算数比较用单中括号[ ]——左右留空格 算数运算用双小括号(( )) :shell命令及输出用小括号( )——左右不留空格 快速替换用花括号{ }——左右留 ...

  5. Shell学习(四)——shell中各种括号的作用

    参考博客: [1]shell中各种括号的作用().(()).[].[[]].{} [2]shell中的单层大/中/小括号.双层大中小括号.命令替换等 一.前言 目录 单括号() 双括号(( )) 单中 ...

  6. Shell中的特殊字符(三)

    一 通配符 [root@192 test]# touch abc [root@192 test]# touch abcd [root@192 test]# touch 012 [root@192 te ...

  7. shell脚本中的几个括号总结(小括号/大括号/花括号)--from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html

    在Shell中的小括号,大括号结构和有括号的变量,命令的用法如下: 1.${var}2.$(cmd)3.()和{}4.${var:-string},${var:+string},${var:=stri ...

  8. shell中的括号(小括号,中括号,大括号)及单引号、 双引号,反引号(``)

    一.小括号,园括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

  9. shell脚本中的几个括号总结(小括号/大括号/花括号)

    from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html 是毋庸置疑的,方便了我们也迷惑了我们,比如这些杂七杂八的括号 ...

随机推荐

  1. Careercup - Microsoft面试题 - 5673934611546112

    2014-05-10 23:26 题目链接 原题: what is the best,worst and average case complexity for fibonacci no.s ..ex ...

  2. 转载------------------关于android的一些技巧

    Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击 ...

  3. 通过Log4j的DEBUG级别来显示mybatis的sql语句

        为了更加方便调试sql语句,需要显示mybatis的sql语句.     网络上的一般方式都是通过log4j来实现,但是很多都有问题.      经过实验,以下代码能够保持正常:(只显示myb ...

  4. 【Python】多线程编程

    1.thread模块 2.threading模块 3.Queue模块与多线程互斥 简介: thread和threading模块允许创建和管理线程,thread模块提供了基本的线程和锁的支持,而thre ...

  5. 【BZOJ】【4004】【JLOI2015】装备购买

    拟阵/贪心 题解戳这里:http://blog.csdn.net/popoqqq/article/details/45148309 思路: 裸拟阵…… 维护线性基,将武器按价格排序,从小到大塞进去,如 ...

  6. 实现IDisposable接口的模式

    代码: public class Class2 : IDisposable { ~Class2() { Dispose(false); } public void Dispose() { Dispos ...

  7. linux install

    http://www.ubuntu.org.cn/index_kylin 先在官网下个Ubuntu  是个iso 然后下个UltraISO 是个软件 插好空u盘 打开软件 在菜单栏上 点击 文件-&g ...

  8. 7-Highcharts曲线图之分辨带

    <!DOCTYPE> <html lang='en'> <head> <title>7-Highcharts曲线图之分辨带</title> ...

  9. Java多线程程序设计详细解析

    一.理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线 ...

  10. IE8下jQuery改变png图片透明度时出现的黑边问题

    png24格式的图片在用jQuery添加显示隐藏动画时发现,图片的半透明区域出现黑边? 在网上搜了搜主要有以下几种办法: 1.把图片保存成PNG-8格式. 2.把背景色一起切入并保存为JPG格式. 以 ...