`
yhz61010
  • 浏览: 564536 次
  • 来自: -
博客专栏
63c13ecc-ef01-31cf-984e-de461c7dfde8
libgdx 游戏开发
浏览量:12298
社区版块
存档分类
最新评论

[转] shell中各种括号的作用()、(())、[]、[[]]、{}

阅读更多
原文地址:http://blog.csdn.net/taiyang1987912/article/details/39551385

一、小括号,圆括号()
1、单小括号 ()
   ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
   ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
    ③用于初始化数组。如:array=(a b c d)
2、双小括号 (( ))
    ①整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是"假",而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。若是逻辑判断,表达式exp为真则为1,假则为0。
    ②只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
    ③单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
    ④常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。

二、中括号,方括号[]
  1、单中括号 []
    ①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
    ②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
    ③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
    ④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。
2、双中括号[[ ]]
    ①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
    ②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
    ③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
    ④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
例子:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
if ($i<5)   
if [ $i -lt 5 ]   
if [ $a -ne 1 -a $a != 2 ]   
if [ $a -ne 1] && [ $a != 2 ]   
if [[ $a != 1 && $a != 2 ]]   
    
for i in $(seq 0 4);do echo $i;done   
for i in `seq 0 4`;do echo $i;done   
for ((i=0;i<5;i++));do echo $i;done   
for i in {0..4};do echo $i;done   

三、大括号、花括号 {}
1、常规用法
    ①大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
# ls {ex1,ex2}.sh   
ex1.sh  ex2.sh   
# ls {ex{1..3},ex4}.sh   
ex1.sh  ex2.sh  ex3.sh  ex4.sh   
# ls {ex[1-3],ex4}.sh   
ex1.sh  ex2.sh  ex3.sh  ex4.sh   
    ②代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。
  2、几种特殊的替换结构
${var:-string},${var:+string},${var:=string},${var:?string}
      ①${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
      ② ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
      ③${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
      补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
3、四种模式匹配替换结构模式匹配记忆方法:
# 是去掉左边(在键盘上#在$之左边)
% 是去掉右边(在键盘上%在$之右边)
#和%中的单一符号是最小匹配,两个相同符号是最大匹配。

${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
     第一种模式:${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
     第二种模式: ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
     第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
     第四种模式: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
     这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。
# var=testcase    
# echo $var    
testcase    
# echo ${var%s*e}   
testca    
# echo $var    
testcase   
# echo ${var%%s*e}   
te  
# echo ${var#?e}    
stcase  
# echo ${var##?e}    
stcase  
# echo ${var##*e}    
  
# echo ${var##*s}    
e    
# echo ${var##test}    
case    
4、字符串提取和替换
${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
       第一种模式:${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。        
        第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。
       第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。。        
       第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。
[root@centos ~]# var=/home/centos  
[root@centos ~]# echo $var  
/home/centos  
[root@centos ~]# echo ${var:5}  
/centos  
[root@centos ~]# echo ${var: -6}  
centos  
[root@centos ~]# echo ${var:(-6)}  
centos  
[root@centos ~]# echo ${var:1:4}  
home  
[root@centos ~]# echo ${var/o/h}  
/hhme/centos  
[root@centos ~]# echo ${var//o/h}  
/hhme/cenths  
四、符号$后的括号
(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。

(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。

(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
五、使用
1、多条命令执行
(1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。

(2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
分享到:
评论

相关推荐

    一文读懂 Shell 中各种括号的作用.doc

    Shell 中各种括号的作用 Shell 中括号的作用是 Shell 编程中最基本也是最重要的部分。括号的使用可以帮助我们更好地控制 Shell 的行为,提高编程效率和代码的可读性。本文将详细介绍 Shell 中各种括号的作用,包括...

    大括号在shell中的使用

    在Shell脚本编程中,大括号({})扮演着至关重要的角色,它们被广泛用于各种语法结构和操作。下面将详细介绍大括号在Shell中的主要用途。 1. **数组定义**:在Shell中,大括号用于定义数组。例如,创建一个包含三个...

    shell 脚本各种括号的用途.docx

    括号中的命令可以通过分号进行分隔,最后一个命令后的分号可省略,且括号与命令之间无需留有空格。 示例: ```bash (echo "command 1"; echo "command 2") ``` - **命令替换**:`$(cmd)` 或者 `cmd` 的形式...

    shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)

    在Shell脚本编程中,括号有着特殊的意义和作用,主要分为五种类型:小括号()、双小括号(())、中括号([])、双中括号([[]])以及大括号({})。下面将详细介绍每一种括号的作用。 1. **小括号()** - 命令组:圆...

    shell括号

    Shell括号在脚本编写中扮演着重要的角色,了解它们的不同用途可以帮助开发者更好地控制脚本的行为。无论是变量扩展、命令替换、流程控制还是数学运算,正确使用括号可以大大提高脚本的效率和灵活性。希望本文的内容...

    shell脚本学习指南中文

    2. 注释:在Shell脚本中,任何以#开头的行都是注释,解释器不会执行这些行,它们用于向阅读脚本的人解释代码的作用。良好的注释习惯可以帮助维护和理解脚本内容。 3. 变量:在Shell脚本中,变量用于存储和传递数据...

    brackets-shell, 基于CEF3的括号应用 shell.zip

    brackets-shell, 基于CEF3的括号应用 shell 概述这是用于括号的CEF3-based应用...请阅读括号 repo 中的主自述文件,了解关于括号的一般信息。如果你对这个 shell 感兴趣,请在 brackets-dev Google或者在freenode的 #b

    shell脚本语言.pdf

    Shell 既可以交互式地解释和执行用户输入的命令,也可以定义各种变量和参数,提供了许多控制结构,包括循环和分支。 Shell 调用了系统核心的大部分功能来执行程序、建立文件,并以并行的方式协调各个程序的运行。 ...

    详解:Bash Shell 脚本中的括号:()、(( ))、[ ]、[[ ]]、{ } 及 他们使用的运算符!

    1.2、关于 ( ) 中使用的运算符:2、双小括号 —— (( )):2.1、作用:2.2、关于 (( )) 中使用的运算符:3、Bash 内部命令 —— [ ] :3.1、作用:3.2、关于 [ ] 中使用的运算符:4、双中括号 —— [[ ]] :4.1、作用:...

    shell与python文档

    在Shell脚本中,使用export命令可以将变量导出为全局变量,使之在子Shell中也能访问: ```shell export VARIABLE_NAME=value ``` 或者 ```shell declare -x VARIABLE_NAME=value ``` 五、Shell字符串操作 Shell字符...

    shell 编程大全指南

    深入讲解Shell脚本中的特殊字符及其作用,包括但不限于引号、转义字符等,帮助读者理解如何正确引用变量和命令。 #### 第四章:变量与参数简介 本章重点介绍变量替换、赋值、类型及特殊类型,如环境变量和位置参数...

    Linux-shell脚本全面学习.pdf

    * 使用花括号来告诉 shell 我们要打印的是哪个变量: `echo "this is the ${num}nd"` 1.1.4 环境变量 * 环境变量是由 `export` 关键字处理过的变量 * 通常情况下仅仅在登录脚本中使用环境变量 1.1.5 Shell 命令和...

    shell图形化总结

    Shell脚本是一种非常强大的工具,它可以用来自动化各种任务。随着图形用户界面(GUI)的普及,命令行界面(CLI)的操作在许多用户看来似乎显得有些过时。然而,对于系统管理员和开发人员来说,CLI仍然不可或缺。...

    Shell 十三问(SHELL 13Q)

    - **`()`**:用于创建子Shell环境,在括号内的命令会在一个新的子Shell中执行。 - **`{}`**:用于创建一组命令,这些命令在一个单一的Shell环境中执行,不会创建新的子Shell。 #### 八、`$(())`、`$()`与`${}`的...

    LinuxShell编程基础教程.pdf

    Linux Shell 编程基础教程 本资源为 Linux Shell 编程基础教程,涵盖了 Linux Shell 编程的基础知识,包括语法基本介绍...这些命令可以帮助我们在 Shell 脚本中完成各种任务,例如文件操作、字符串处理、数学运算等。

    学习shell的13个难点

    7. 圆括号()与花括号{}的区别:在Shell中,圆括号用于命令替换和命令分组执行。命令替换是将命令输出的结果赋值给变量或作为其他命令的输入;命令分组则允许将多个命令作为一个单元执行。花括号在Shell中有多种用途...

    shell脚本大全

    "shell脚本大全"这个资源可能包含了大量的示例脚本,涵盖了各种用途和场景,对于学习和提升Shell编程技能非常有帮助。 Shell脚本基于Shell解释器,如Bash(Bourne-Again SHell)或其他类型的Shell,如KSH(Korn ...

Global site tag (gtag.js) - Google Analytics