Shell 脚本中经常需要用到一些括号、引号表达式,功能各不相同,本文详细介绍一下。

1、双引号 " "

  双引号常用于包含一组字符串,在双引号中,除了 "$"、"\"、" ` (反引号)"有特殊含义外,其余字符(如IFS、换行符、回车符等)没有特殊含义。

$ a=
$ echo "$a"

  输出结果为 3,在双引号中 $ 符仍有特殊含义。

2、单引号 ' '

  单引号的功能与双引号类似,不过单引号中的所有字符都没有特殊含义:

$ a=
$ echo '$a'

  输出结果为 $a,可见在单引号中 $ 符是不起作用的。

3、反引号 ` `

  反引号的功能是命令替换,在反引号 ` ` 中的内容通常是命令行,程序会优先执行反引号中的内容,并使用运行结果替换掉反引号处的内容。举个例子:

$ echo `date`

  这行命令会先执行反引号中的命令 date,然后用 echo 命令打印出 date 命令的结果(与直接使用 date 命令效果一样)。再举个例子:

#!/bin/bash

a=
b=
c=`expr $a \* $b` echo $c exit

4、$ + 小括号 $( )

  $(...) 的作用与反引号一样,也是命令替换:

#!/bin/bash

for file in $(ls /)
do
echo $file
done exit

  这个脚本使用 for 循环打印根目录下所有文件的文件名,使用 $(ls /) 先获得根目录下的所有文件,并将其作为参数列表传给 for 结构。

5、$ + 双小括号 $(( ))

  $(( )) 的功能是进行算术运算,括号中的内容为数学表达式,使用 $(( )) 可以求数学表达式的值:

#!/bin/bash

a=
b=
c=$(($a * $b))
echo $c exit

  上述脚本的输出结果为 15。

  使用 $(( )) 进行数学运算时,不需要担心乘号( * )等运算符被 shell 误解为其他含义,因为它们都在括号内。

6、$ + 中括号 $[ ]

  $[ ] 的功能与 $(( )) 一样,都是用于算术运算。

7、$ + 大括号 ${ }

  ${ } 的功能是变量替换,类似于 $ 符,但是 ${ } 比 $ 的替换范围更精准:

#!/bin/bash

a=
b=
echo $ab
echo ${a}b exit

  这段脚本,第一次输出 $ab 的时候,会把 ab 视作一个变量,然后打印 ab 的值,显然为空;第二次使用 ${a}b,则会先输出 a 的值然后再向 STDOUT 打印一个字符 b。

8、小括号 ( )

  小括号可以用来定义一个数组变量,如下:

array1=(    )            // 在 shell 中定义一个数组变量
array2=(one two three four five)

  取数组元素的值也是使用 $ 符号,如下:

$ echo $array1
$
$
$ echo ${array1[]} # 取数组中的一个元素,索引用方括号括起来,和大部分语言一样,数组的索引是从 开始的
$
$
$ echo ${array2[]}
$ one
$
$ echo ${array2[*]} # 输出整个数组
$ one two three four five

  这里使用了 ${ } 表达式,进行变量替换。

注意:在 shell 中使用数组变量有时会引起一些问题,而且数组变量的可移植性并不好,因此在 shell 编程中,数组变量使用得并不多。

9、双小括号 (( ))

  双小括号命令允许在比较过程中使用高级数学表达式:

(( expression ))

  其中,expression 可以是任意的数学赋值或表达式。相比 test 命令只能在比较中使用简单的算术操作,双小括号命令提供了更多的数学符号,可以在双小括号中进行各种逻辑运算、数学运算,也支持更多的运算符(如 ++、-- 等)。

  常使用的双小括号来在 for 循环中实现 C 语言风格的迭代:

#!/bin/bash

for ((i = ; i < ; i++))
do
echo -n "$i "
done
echo "" exit

10、中括号 [ ]

  单个的中括号的功能与 test 命令一样,都是用作条件测试。

#!/bin/bash

read -p "please enter a number: " num

if [ $num -gt  ]; then
echo "num > 10"
else
echo "num <= 10"
fi

11、双中括号 [[ ]]

  双中括号提供了针对字符串比较的高级特性,使用双中括号 [[ ]] 进行字符串比较时,可以把右边的项看做一个模式,故而可以在 [[ ]] 中使用正则表达式:

#!/bin/bash

if [[ hello == hell* ]]; then
echo "equal"
else
echo "unequal"
fi exit

12、大括号 { }

  大括号用于括起一个语句块。如果需要在某些只能使用单个语句的地方(如AND、OR列表中)使用多条语句,则可以用大括号将这多条语句括起来构造一个语句块。

总结

功能 符号
引用字符串,字符串中部分特殊符号有意义 双引号 " "
引用字符串,字符串中特殊符号全都没有意义 单引号 ' '
命令替换 反引号` `、$()
算术运算 $(( ))、$[ ]、(( ))
变量替换 ${}
数组初始化 ()
条件测试 [ ]
字符串比较 [[ ]]
括起一个语句块 { }

  以上是个人的一些总结,可能还不全面,以后遇到再作补充吧。如果有不正确的地方还望指正。

Shell 基础 -- 总结几种括号、引号的用法的更多相关文章

  1. 【转载】Shell 基础 -- 总结几种括号、引号的用法

    原作者:tongye 原文链接:https://www.cnblogs.com/tongye/p/10646211.html 以下为原文: Shell 脚本中经常需要用到一些括号.引号表达式,功能各不 ...

  2. Linux Shell基础 单引号、双引号、反引号、小括号和大括号

    单引号和双引号 单引号和双引号用于变量值出现空格时将字符用引号括起来. 二者的主要区别在于, 被单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义: 被双引号括起来的字符中,"$& ...

  3. shell基础篇(三)--引号

    ---今天篇幅比较少:只介绍引号. shell中的引号有三种:双引号",单引号',反引号`1. 双引号:由双引号括起来的字符,除$.倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作 ...

  4. centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课

    centos shell基础知识 alias  变量单引号 双引号   history 错误重定向 2>&1  jobs  环境变量 .bash_history  source配置文件 ...

  5. (转)Linux基础------Shell数值计算的几种方法

    Linux基础------Shell数值计算的几种方法 原文:http://blog.csdn.net/fu_wayne/article/details/21620639 在Linux下总会遇到数值计 ...

  6. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  7. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  8. Shell基础入门

    目录 Shell基础入门 1.什么是Shell? 2.Shell脚本的结构 3.Shell的变量 3.1.自定义环境变量 3.2.普通变量 3.3.位置参数变量 3.4.状态变量 4.条件测试和比较 ...

  9. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

随机推荐

  1. 参观阿拉斯加进行产品培训[My representation]

    I  suggest to visit Alaska for product training. Alaska is one of the best places to spend a trainin ...

  2. 4星|《门口的野蛮人2》:美国宝万之争专业户KKR公司的疯狂借债收购史

    门口的野蛮人2:KKR与资本暴利的崛起(珍藏版) 英文版是1992年出的.主要内容是1977-1998年之间KKR在美国的杠杆收购简史.从KKR创立开始,讲到1990年KKR差点倒闭.国内A股市场上前 ...

  3. SDN 第三次上机作业

    SDN 第三次上机作业 1.创建拓扑 2.利用OVS命令下发流表,实现vlan功能 3.利用OVS命令查看流表 s1: s2: 4.验证性测试 5.Wireshark 抓包验证

  4. SSL/TLS Diffie-Hellman Modulus <= 1024 位 (LogJam) 使用2048位或更高的Diffie-Hellman

    1.http://slproweb.com/products/Win32OpenSSL.html  下载 SSL 并安装 2.设置环境变量,例如工具安装在C:\OpenSSL-Win64,则将C:\O ...

  5. Python接口自动化--requests 2

    # _*_ encoding:utf-8 _*_ import json import requests #post请求 payload = {"cindy":"hell ...

  6. BZOJ 1087 互不侵犯King 状态压缩DP

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1087 题目大意; 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国 ...

  7. Tengine 2.1.2 (nginx/1.6.2)安装配置,淘宝 Web 服务器

    简介 Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很 ...

  8. ES6标准入门之数值的拓展解说

    ES6提供了二进制和八进制数值的新写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503                    // true 0o767 === ...

  9. pandas中的series数据类型

    import pandas as pd import numpy as np import names ''' 写在前面的话: 1.series与array类型的不同之处为series有索引,而另一个 ...

  10. C#实现之(自动更新)

    做开发的人,尤其是做客户端(C/S)系统开发的人都会遇到一个头疼的问题,就是软件的自动更新:系统发布后怎样自动的更新程序,在下有幸开发过一个自动更新程序,更新程序与任何宿主程序是完全独立的:只要在主程 ...