zoukankan      html  css  js  c++  java
  • Shell中括号的使用

    括号的基本介绍

    • shell中分为大括号、中括号、小括号;大括号又名花括号,中括号又名方括号,小括号又名圆括号;
    • shell根据功能的不同进行区分括号的功能。
    • shell根据扩展功能的区分,括号功能如下:

    大括号

    变量的判断与初始化,示例如下:

    sh-4.2# file=/dir1/dir2/dir3/my.file.txt
    sh-4.2# echo ${file#*/}
    dir1/dir2/dir3/my.file.txt

    普通扩展,示例如下:

    sh-4.2# echo a{b,c,d,e,f,g}h
    abh ach adh aeh afh agh

    自动补全,示例如下:

    sh-4.2# echo {a..f}
    a b c d e f

    代码块,示例如下:

    #!/bin/bash
    num() {
    ls -lah
    }
    num

    中括号

    shell扩展中并没有中括号的使用,shell命令中对中括号主要是用于判断,类似test,示例如下:

    1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。以下情况分为变量为单个单词,含有空格的词组。

    sh-4.2# name=hello
    sh-4.2# [ $name = "hello" ]
    sh-4.2# echo $?
    0
    sh-4.2# [[ $name = "hello" ]]
    sh-4.2# echo $?
    0

      得出结论,因为变量只有一个单词,单双括号的单词分离都没有影响到这个变量了。

    sh-4.2# name="hello world"
    sh-4.2# [ $name = "hello world" ]
    sh: [: too many arguments
    sh-4.2# echo $?
    2
    
    sh-4.2# [ "$name" = "hello world" ]
    sh-4.2# echo $?
    0
    
    sh-4.2# [[ $name = "hello world" ]]
    sh-4.2# echo $?
    0

      这次变量是一个词组了,带空格那种了。当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了[ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令中,即使变量含有空格又何妨,因为它不能对变量单词进行分离。

    2.单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。

    sh-4.2# ls -lah test 
    -rw-r--r-- 1 root root 6 Dec 17 15:51 test
    sh-4.2# test -r test ; echo $?
    0
    sh-4.2# [ -r test ]; echo $?
    0

    3.单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。言外之意,双中括号支持正则。

    sh-4.2# name=tom
    sh-4.2# [ $name = t?? ]
    sh-4.2# echo $?
    1
    sh-4.2# [[ $name = t?? ]]
    sh-4.2# echo $?
    0

    4.在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。
      我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。

    sh-4.2# name=tomm
    sh-4.2# [[ $name = tom ]] 
    sh-4.2# echo $?
    1
    sh-4.2# name=tom
    sh-4.2# name1=tomm
    sh-4.2# [[ $name = tom ]] 
    sh-4.2# echo $?
    0
    sh-4.2# [[ $name = tom? ]]
    sh-4.2# echo $?
    1
    sh-4.2# [[ $name1 = tom ]]
    sh-4.2# echo $?
    1
    sh-4.2# [[ $name1 = tom? ]]
    sh-4.2# echo $?
    0
    sh-4.2# [[ $name = "tom" ]]
    sh-4.2# echo $?
    0
    sh-4.2# [[ $name = "tom?" ]]
    sh-4.2# echo $?
    1
    sh-4.2# [[ $name1 = "tom" ]]
    sh-4.2# echo $?
    1

    5.[ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。

    sh-4.2# ls -lah test 
    -r--r--r-- 1 root root 6 Dec 17 15:51 test
    sh-4.2#  [ -r test -a -x test ]
    sh-4.2# echo $?
    1

    [[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与非或使用(&& || !)的形式了。

    sh-4.2# echo $name
    tom
    sh-4.2# [[ $name = [tT]om && $name = t?? ]]
    sh-4.2# echo $?
    0

    小括号

    1、单小括号( ):把括号内的命令在另一个shell执行,并把结果返回,左右不留空格,一般要带前缀 $;示例如下

    sh-4.2# echo $(ls)
    1 test
    sh-4.2# ls -lah
    total 8.0K
    drwxr-xr-x   2 root root  27 Dec 17 17:51 .
    dr-xr-xr-x. 19 root root 268 Dec 17 15:03 ..
    -rw-r--r--   1 root root  80 Dec 17 17:51 1
    -r--r--r--   1 root root   6 Dec 17 15:51 test

    2、双小括号(( )) :整数比较、四则运算,括住的内容,完全符合C语言语法,一般要带前缀 $

    sh-4.2# echo $((1+2))
    3

    shell根据正则功能的区分

    大括号表示次数,示例如下

    sh-4.2# cat file 
    1234
    11234
    2345
    22345
    5678
    12345678
    
    sh-4.2# grep -E "1{2}" file --color
    11234

    中括号表示范围,示例如下

    sh-4.2# grep -E "[1-4]" file --color
    1234
    11234
    2345
    22345
    12345678

    小括号表示一个完整的字符串,示例如下

    sh-4.2# grep -E "(1234)" file  --color
    1234
    11234
    12345678
  • 相关阅读:
    Java——多线程常见面试题
    Java——线程定时器
    Java——多线程练习
    Java——线程池
    Java——线程间通信
    Java——线程死锁问题
    Java——线程同步
    Java多线程安全问题
    Java——多线程面试问题
    Java——多线程小例子
  • 原文地址:https://www.cnblogs.com/guge-94/p/10482276.html
Copyright © 2011-2022 走看看