原作者:tongye

原文链接:https://www.cnblogs.com/tongye/p/10646211.html

以下为原文:

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

1、双引号 " "

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

    $ a=3
$ echo "$a"

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

2、单引号 ' '

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

    $ a=3
$ echo '$a'

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

3、反引号

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

    $ echo `date`

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

    #!/bin/bash

    a=3
b=5
c=`expr $a \* $b` echo $c exit 0

4、$ + 小括号 $( )

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

    #!/bin/bash

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

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

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

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

    #!/bin/bash

    a=3
b=5
c=$(($a * $b))
echo $c exit 0

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

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

6、$ + 中括号 $[ ]

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

7、$ + 大括号 ${ }

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

    #!/bin/bash

    a=3
b=5
echo $ab
echo ${a}b exit 0

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

8、小括号 ( )

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

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

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

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

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

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

9、双小括号 (( ))

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

    (( expression ))

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

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

    #!/bin/bash

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

10、中括号 [ ]

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

    #!/bin/bash

    read -p "please enter a number: " num

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

11、双中括号 [[ ]]

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

    #!/bin/bash

    if [[ hello == hell* ]]; then
echo "equal"
else
echo "uneq复制代码ual"
fi exit 0

12、大括号 { }

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

总结:

功能 符号

引用字符串,字符串中部分特殊符号有意义 双引号 " "

引用字符串,字符串中特殊符号全都没有意义 单引号 ' '

命令替换 反引号 、$()

算术运算 $(( ))、$[ ]、(( ))

变量替换 ${}

数组初始化 ()

条件测试 [ ]

字符串比较 [[ ]]

括起一个语句块 { }

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

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

    Shell 脚本中经常需要用到一些括号.引号表达式,功能各不相同,本文详细介绍一下. 1.双引号 " " 双引号常用于包含一组字符串,在双引号中,除了 "$". ...

  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 shell 基础 使用日志与心得

    linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...

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

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

  8. Linux Shell基础(下)

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

  9. Shell基础入门

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

随机推荐

  1. 51nod 1004 【快速幂】

    思路: 掐住最后一位,快速幂一发就好了 #include<cstdio> #include <map> #include<iostream> #include< ...

  2. bzoj 3172: [Tjoi2013]单词【AC自动机】

    一眼AC自动机,就是先把串建一个自动机,标记每个串在自动机上的位置,然后加上间隔符连成一个串在自动机上跑,每跑到一个点就说明这个串以及它到root的所有点表示的串都要被更新一次 先在点上打上标记,最后 ...

  3. git apply

    1. git 安装   2.git 与服务器的验证   1.生成ssh ssh-keygen -t rsa -C "1107247128@qq.com" 2.查看生成的pub文件, ...

  4. PAT 1035 插入与归并(25)

    原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040传送门: 根据维基百科的定义: 插入排序 ...

  5. c++ 优先级大全

    重置优先级

  6. 【数据结构(C语言版)系列三】 队列

    队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...

  7. EJB Timer Service is not available. Timers for application with id 95795415990861824 will not be deleted

    delete follows:glassfish\domains\domain1\applications\ejb-timer-service-appglassfish\domains\domain1 ...

  8. 【js数据结构】图的深度优先搜索与广度优先搜索

    图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...

  9. 在Java8的foreach()中使用break、continue

    java8的lambda中,foreach()处理集合时不能使用break和continue这两个方法,可以使用return实现 参考:https://blog.csdn.net/lmy86263/a ...

  10. iOS 播放本地,网络视频

    /** *  创建媒体播放控制器MPMoviePlayerControlle 可以控制尺寸 * *  @return 媒体播放控制器 */ -(MPMoviePlayerController *)mo ...