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. [Spark RDD_add_1] groupByKey & reduceBykey 的区别

    [groupByKey & reduceBykey 的区别] 在都能实现相同功能的情况下优先使用 reduceBykey Combine 是为了减少网络负载 1. groupByKey 是没有 ...

  2. 一起学习Boost标准库--Boost.texical_cast&format库

    今天接续介绍有关字符串表示相关的两个boost库: lexical_cast 将数值转换成字符串 format 字符串输出格式化 首先,介绍下lexical_cast ,闻其名,知其意.类似C中的at ...

  3. EF5.0中的跨数据库操作

    以前在用MVC + EF 的项目中,都是一个数据库,一个DbContext,因此一直没有考虑过在MVC+EF的环境下对于多个数据库的操作问题.等到要使用时,才发现这个问题也不小(关键是有个坑).直接说 ...

  4. Yii2 使用 RESTful 写API接口 实例

    Yii2 使用 RESTful? 其实 Yii2 框架本身就对 RESTful 是友好支持的,具体可以看官方文档(http://www.yiichina.com/doc/guide/2.0/rest- ...

  5. 高斯消去、追赶法 matlab

    1. 分别用Gauss消去法.列主元Gauss消去法.三角分解方法求解方程组 程序: (1)Guess消去法: function x=GaussXQByOrder(A,b) %Gauss消去法 N = ...

  6. 解决ThinkPHP中开启调试模式无法加载模块的问题。

    刚开始学习ThinkPHP就遇到这种问题,还是自己粗心. 错误如下: 原因:开启调试模式,区分大小写的,要把模块名首字母大写就OK了.也就是: [plain] view plain copy http ...

  7. ModuleNotFoundError No module named urllib2

    ModuleNotFoundError No module named urllib2?那么在进行编辑的来进行代码上开发,那就会出现的来代码的上错误,也是版本的上差异导致的问题.   工具/原料   ...

  8. BZOJ 1345 序列问题 单调栈

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1345 题目大意: 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce( ...

  9. python第三十八课——面向对象(一)

    1.面向对象:(思想) 面向:看.关注.瞅 对象:个体.实体.实例.结果单词:object在python中一些皆对象 面向过程:(思想) 面向:看.关注.瞅 过程:经过.经历.从头到尾 使用一些生活中 ...

  10. hdu 1754 I Hate It (线段树功能:单点更新和区间最值)

    版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/32982923 转载请注明出处 ...