shell编程之 ()[] {}

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. [[email protected] ~]# array=(a b c d)

  2.  

    [[email protected] ~]# 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. [[email protected] ~]# echo 1234abcdef |tr -cd "[0-9]"

  2.  

    1234[[email protected] ~]# cat 1.txt|grep "[0-9]"

  3.  

    123

  4.  

    135

  5.  

    1244

  6.  

    156

  7.  

    222

  8.  

    178

  9.  

    189999

  10.  

    12gg

  11.  

    [[email protected] ~]#

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

  1. [[email protected] ~]# echo ${name[2]}

  2.  

    durank

  3.  

    [[email protected] ~]#

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. [[email protected] ~]# var=/home/centos

  2.  

    [[email protected] ~]# echo $var

  3.  

    /home/centos

  4.  

    [[email protected] ~]# echo ${var:5}

  5.  

    /centos

  6.  

    [[email protected] ~]# echo ${var: -6}

  7.  

    centos

  8.  

    [[email protected] ~]# echo ${var:(-6)}

  9.  

    centos

  10.  

    [[email protected] ~]# echo ${var:1:4}

  11.  

    home

  12.  

    [[email protected] ~]# echo ${var/o/h}

  13.  

    /hhme/centos

  14.  

    [[email protected] ~]# echo ${var//o/h}

  15.  

    /hhme/cenths

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

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

原文地址:https://www.cnblogs.com/zyy98877/p/10168475.html

时间: 2024-10-10 21:37:06

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

老男孩新书Shell编程实战预定开始了-包邮包答疑

老男孩新书Shell编程实战预定开始了(扫图中二维码购买包邮定期包答疑),亲爱的伙伴们,让你们久等了.电脑用户猛戳 电脑购买链接 注意:包邮包3个月(2017春节后起算)Q群书籍内容答疑,等于白送书,还倒搭答疑服务. 如果觉得给力,请帮忙朋友圈.QQ群.空间转载! 活动优惠仅限本次活动,从其他渠道购买不享受此次的服务承诺. 定价 89元 基本信息 作者: 老男孩 丛书名: Linux/Unix技术丛书 出版社: 机械工业出版社 ISBN:9787111556077 上架时间:2017-1-6 出

shell编程中for,while,util,case,select,break, continue用法详解

关于shell脚本的更多详细实例讲解请参考:http://www.cnblogs.com/yuexiaxiaoxi/category/646749.html Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for.while和until.while循环和for循环属于"当型循环",而until属于"直到型循环".循环控制符:break和continue控制流程转向. 参考:<Linux 与unix shell 编程指

shell编程(七)--- sed的用法

sed:称为流编辑器,也称为行编辑器. sed处理过程:sed读取源文件中的一行,并将其放在临时缓冲区中,这个缓冲区称为模式空间,使用相应的模式对模式空间进行处理,并将处理的结果显示到屏幕上,并不会影响源文件,处理结束后,将模式空间中的内容显示至屏幕. sed格式: sed [options] 'AddressCommand' file ... options: -n:静默模式,不显示模式空间中的内容,默认显示默认空间中的内容.常和p命令一起使用. -i:直接修改源文件的内容. -e 'Addr

shell编程基础必知

shell编程 ################################################ 静态语言 动态语言 ################################################ 编程语言:机器语言,汇编语言,高级语言 ################################################ 面向对象的编程语言:sehll c 面向对象的编程语言:JAVA Python perl c++ ################

shell编程详解(一)

shell编程 语言分为: 编译型语言:先要事先转换成可执行格式 解释型语言:边解释边执行 变量:shell是弱类型编程语言,变量不需要先指明类型及初始化,而是由上下文决定类型 bash变量类型: 环境变量 本地变量 位置变量 特俗变量 本地变量:作用域为整个bash进程 VARNAME=value 局部变量:作用域当前代码 local VARNAME=value 环境变量:作用域为当前shell进程及子进程 export VARNAME=value 条件判断 hash中如何实现条件判断? 条件

linux shell编程

1.什么是shell 2. 还是hello world程序 3. shell中的变量 3.1 系统变量 3.2 用户定义变量 3.2.1 用户定义变量规则 3.2.3 shell如何使用变量 3.2.3 全局变量 vs 局部变量 4. shell编程中的控制结构 4.1 条件判定 4.1.1 简单条件判定 4.1.2 组合判定 4.2  if - else 4.3 for 4.4 while 4.5 case 5. shell中的函数 5.1 函数声明和定义 5.2 函数调用 6. shell脚

centos shell编程4【分发系统】 第三十八节课

centos shell编程4[分发系统]  第三十八节课 http://www.cnblogs.com/MYSQLZOUQI/p/4811790.htmlmkpasswd 生成密码的工具,安装 expect包 yum install -y expect 上半节课 下半节课 f

第三章 shell编程之运算符

shell编程之运算符 一 shell变量的缺点 弱类型: 默认字符串型: 二 declare声明变量类型 格式:declare [+/-][选项] 变量名 -:给变量设定类型属性: +:取消变量的类型属性: -a:将变量声明为数组型:

shell编程基础

for c in a b c d e f g;do echo $c; done 按顺序输出 for c in a b c d e f g;do tar czvf install.log.$c.tar.gz install.log ; done for c in {a..g}; do echo $c; done 和上面的一样 seq 1 10 列数字的 for i in {1..10}; do echo $i; done 字符串变量实例str='I love linux. I love unix

Linux Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne