shell脚本中各种括号的区别以及用法

2018年08月19日 14:55:33 M_QiJunChao 阅读数:273
 

最近学到了shell脚本编程,觉得脚本中的不同括号有不同的用处,以及有些括号的格式也有特殊要求,下面我就总结一下各种括号的用法。

一、小括号();双小括号(())

1、单小括号 ()

1:命令替换。等同于`comm`,shell扫描一遍命令行,发现了$(comm)结构,便将$(comm)中的comm执行一次,得到其标准输出,再将此输出放到原来命令。

  1.  
    # ls
  2.  
    a b c
  3.  
    # echo $(ls)
  4.  
    a b c
  5.  
    #echo `ls`
  6.  
    a b c

2:用于初始化数组。如:array=(a b c d)

  1.  
    [root@localhost ~]# array=(a b c d)
  2.  
    [root@localhost ~]# declare -a
  3.  
    declare -a array='([0]="a" [1]="b" [2]="c" [3]="d")'

2、双小括号 (())
((表达式))常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合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.  
    #求100以内的偶数
  2.  
     
  3.  
    #! /bin/bash
  4.  
    num=2
  5.  
    while ((num<100)) #数值与运算符可以没有空格,变量的使用时也可以不使用$num
  6.  
    do
  7.  
    echo "$num"
  8.  
    ((num=num*2))
  9.  
    done

二、中括号[ ];双中括号[[ ]]

1:单中括号[ ]

1:算术比较, 比如一个变量是否为0, [ $var -eq 0 ]

  1.  
    [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
  2.  
    [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o

对变量或值进行算术条件判断:

  1.  
    [ $var -eq 0 ] # 当 $var 等于 0 时,返回真
  2.  
    [ $var -ne 0 ] # 当 $var 不等于 0 时,返回真

需要注意的是 [ 与 ] 与操作数之间一定要有一个空格,否则会报错。比如下面这样就会报错:

[$var -eq 0 ]  或 [ $var -ne 0] 

其他比较操作符:

操作符 意义
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于

可以通过 -a (and) 或 -o (or) 结合多个条件进行测试:

  1.  
    [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
  2.  
    [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o

2:文件属性测试,比如一个文件是否存在,[ -e $var ], 是否是目录,[ -d $var ]

文件系统属性测试

使用不同的条件标志测试不同的文件系统属性。

操作符 意义
[ -f $file_var ] 变量 $file_var 是一个正常的文件路径或文件名 (file),则返回真
[ -x $var ] 变量 $var 包含的文件可执行 (execute),则返回真
[ -d $var ] 变量 $var 包含的文件是目录 (directory),则返回真
[ -e $var ] 变量 $var 包含的文件存在 (exist),则返回真
[ -c $var ] 变量 $var 包含的文件是一个字符设备文件的路径 (character),则返回真
[ -b $var ] 变量 $var 包含的文件是一个块设备文件的路径 (block),则返回真
[ -w $var ] 变量 $var 包含的文件可写(write),则返回真
[ -r $var ] 变量 $var 包含的文件可读 (read),则返回真
[ -L $var ] 变量 $var 包含是一个符号链接 (link),则返回真

使用方法如下:

  1.  
    fpath="/etc/passwd"
  2.  
    if [ -e $fpath ]; then
  3.  
    echo File exits;
  4.  
    else
  5.  
    echo Does not exit;
  6.  
    fi

3:字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

  1.  
    [root@localhost ~]# echo 1234abcdef |tr -cd "[0-9]"
  2.  
    1234[root@localhost ~]# cat 1.txt|grep "[0-9]"
  3.  
    123
  4.  
    135
  5.  
    1244
  6.  
    156
  7.  
    222
  8.  
    178
  9.  
    189999
  10.  
    12gg
  11.  
    [root@localhost ~]#

4:在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号

  1.  
    [root@localhost ~]# echo ${name[2]}
  2.  
    durank
  3.  
    [root@localhost ~]#

2:双中括号 [[ ]]

[[ ]] 多用来进行字符串比较, 比如两个字符串是否相同, [[ $var1 == $var2 ]]

注意 = 前后有一个空格,如果忘记加空格, 就变成了赋值语句,而非比较关系了。

字符串的其他比较情况:

操作符 意义
[[ $str1 != $str2 ]] 如果 str1 与 str2 不相同,则返回真
[[ -z $str1 ]] 如果 str1 是空字符串,则返回真
[[ -n $str1 ]] 如果 str1 是非空字符串,则返回真

使用逻辑运算符 && 和 || 可以轻松地将多个条件组合起来, 比如:

  1.  
    str1="Not empty"
  2.  
    str2=""
  3.  
    if [[ -n $str1 ]] && [[ -z $str2 ]];
  4.  
    then
  5.  
    echo str1 is nonempty and str2 is empty string.
  6.  
    fi

test 命令也可以从来执行条件检测,用 test 可以避免使用过多的括号,[] 中的测试条件同样可以通过 test 来完成。

if [ $var -eq 0 ]; then echo "True"; fi

等价于

if test $var -eq 0; then echo "True"; fi

三:大括号{ }

常规用法

1:大括号拓展。在大括号中,不允许有空白,除非这个空白被引用或转义。

第一种:对大括号中的以逗号分割的文件列表进行拓展。

第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,

  1.  
    # ls {ex1,ex2}.sh
  2.  
    ex1.sh ex2.sh
  3.  
    # ls {ex{1..3},ex4}.sh
  4.  
    ex1.sh ex2.sh ex3.sh ex4.sh
  5.  
    # ls {ex[1-3],ex4}.sh
  6.  
    ex1.sh ex2.sh ex3.sh ex4.sh

2:字符串提取和替换

${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。

  1.  
    [root@centos ~]# var=/home/centos
  2.  
    [root@centos ~]# echo $var
  3.  
    /home/centos
  4.  
    [root@centos ~]# echo ${var:5}
  5.  
    /centos
  6.  
    [root@centos ~]# echo ${var: -6}
  7.  
    centos
  8.  
    [root@centos ~]# echo ${var:(-6)}
  9.  
    centos
  10.  
    [root@centos ~]# echo ${var:1:4}
  11.  
    home
  12.  
    [root@centos ~]# echo ${var/o/h}
  13.  
    /hhme/centos
  14.  
    [root@centos ~]# echo ${var//o/h}
  15.  
    /hhme/cenths

字符大小写转换
${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为

引用:https://blog.csdn.net/qq_27281257/article/details/81837040

shell编程之 ()[] {}的更多相关文章

  1. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  2. shell编程:定义简单标准命令集

    shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...

  3. Linux Shell编程入门

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  4. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  5. Linux_10------Linux之shell编程------变量

    .-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...

  6. 需要交互的shell编程——EOF(转载)

    在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...

  7. ****CodeIgniter使用cli模式运行,把php作为shell编程

    shell简介 在计算机科学中,Shell俗称壳(用来区别于核).而我们常说的shell简单理解就是一个命令行界面,它使得用户能与操作系统的内核进行交互操作. 常见的shell环境有:MS-DOS.B ...

  8. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

  9. Linux Shell编程基础

    在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐 ...

  10. centos 下建用户 shell编程

    useradd 用户名 passwd 用户名 cat /etc/passwd  查看用户信息 删除用户 userdel -r   加一个 -r 表示把用户及用户的主目录都删除 su  切换用户 sud ...

随机推荐

  1. 1、windows安装npm教程 --参考自https://www.cnblogs.com/jianguo221/p/11487532.html

    windows安装npm教程   1.在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm:  nodejs 下的包管理器. webpack: 它主要用途是通过CommonJS 的语法把所有 ...

  2. Django rest-framework框架-CSRF验证

    settings.py里面有一个中间件 django.middleware.csrf.CsrfViewmiddleware  #如果注释掉全站不需要csrf验证  如果打开全站都要csrf验证 全局使 ...

  3. css3控制字体动态变换颜色

    css3控制字体动态变换颜色 <!doctype html> <html> <head> <meta charset="utf-8"> ...

  4. printf颜色

    格式 printf("\033[?m%s\033[0m", str); 多个属性以:分隔 属性: \033[0m:关闭所有属性 \033[1m:设置高亮度 \033[4m:下划线 ...

  5. jQuery EasyUI简介

    jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助we ...

  6. unomp 矿池运行问题随记

    经过大量的实践,遇到的问题或经验如下: 1.单机运行多矿池时,单机CPU核心数 成为性能瓶颈,运行两个月后,有部分用户反映 矿机速率只有以前的一半. 2.Dash 等可以自行报块的矿池,每个块的股份比 ...

  7. 4'.deploy.prototxt

    1: 神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真 ...

  8. 实用:Java基础流计算

    java的流不常用,每次学习完都懂,过了一段时间就全忘了... 记录下一点实用的东西... 需求: 截取文件的前250kb内容 public static void main(String[] arg ...

  9. 关于IO的同步,异步,阻塞,非阻塞

    上次写了一篇文章:Unix IO 模型学习.恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现.中途正好讨论了网络IO的同步.异步.阻塞.非 ...

  10. php 5.6 与 php 7 的区别

    1. PHP7.0 比PHP5.6性能提升了两倍. 2.PHP7.0全面一致支持64位. 3.PHP7.0之前出现的致命错误,都改成了抛出异常. 4.增加了空结合操作符(??).效果相当于三元运算符. ...