在 shell 脚本中,[ ][[ ]]( )(( )){ }{{ }} 都有各自特定的用法和区别。下面是对这些结构的详细解释:

1. [ ] (test 命令)

[ ] 是 shell 脚本中用于条件测试的旧式语法,等同于 test 命令。它用于比较整数、检查文件属性等。

用法示例

  1. if [ $a -eq $b ]; then
  2. echo "a is equal to b"
  3. fi

注意

  • 空格是必须的,如 [ $a -eq $b ]
  • 字符串比较时,变量通常需要用引号包围,以避免由于变量值中的空格或特殊字符导致的问题。
  • 不支持正则表达式匹配。

2. [[ ]] (bash 中的条件表达式)

[[ ]] 是 bash 中用于条件测试的新式语法,提供了比 [ ] 更丰富的功能和更友好的语法。

用法示例

  1. if [[ $a == $b ]]; then
  2. echo "a is equal to b"
  3. fi

注意

  • 不需要转义特殊字符。
  • 支持正则表达式匹配和模式匹配。
  • 逻辑操作符(如 &&||)和行为与 [ ] 中的不同,更加直观。
  • 只在 bash 和一些兼容的 shell 中可用。

3. ( )

括号 ( ) 在 shell 脚本中有多种用途:

  • 命令组:括号内的命令会在子 shell 中执行,这意味着括号内的任何变量更改不会影响父 shell。

    用法示例

    1. (cd /tmp; ls)
  • 命令序列:用逗号分隔的多个命令,会在当前 shell 中按顺序执行。

    用法示例

    1. (command1; command2)
  • 函数定义:在 bash 中,括号也用于定义函数。

    用法示例

    1. function_name() {
    2. # 函数体
    3. }

4. (( ))

(( )) 用于算术扩展,可以在 shell 脚本中执行算术运算。

用法示例

  1. if (( a > b )); then
  2. echo "a is greater than b"
  3. fi

注意

  • 不需要 $ 符号来引用变量。
  • 支持常见的算术运算符,如 +-*/% 等。
  • 结果总是整数,小数部分会被舍去。

5. { }

大括号 { } 主要用于创建命令块或组合命令,但它们不会在新的 shell 中执行,这意味着任何在 { } 内部进行的变量更改都会影响到当前的 shell 环境。

用法示例

  1. {
  2. cd /tmp
  3. ls
  4. }

6. {{ }}

在标准的 shell 脚本中,{{ }} 并没有特殊的含义。它可能只是文本的一部分,除非在特定的上下文或特定的 shell 扩展中有特殊的意义。例如,在某些模板引擎或特定的脚本解析器中,它可能有特定的用途。

总的来说,这些结构在 shell 脚本中扮演着重要的角色,并且每个都有其特定的用途和上下文。了解它们的差异和最佳实践对于编写健壮和高效的 shell 脚本至关重要。

在 shell 脚本中,条件表达式通常由测试命令、比较运算符和其他逻辑运算符组合而成。测试命令包括 [ ](test 命令的别名)和 [[ ]](仅在 bash 和一些兼容的 shell 中可用),比较运算符如 eqneltgt 等,而逻辑运算符如 &&(逻辑与)、||(逻辑或)则用于组合多个条件。

让我们逐一讨论这些元素如何结合使用:

1. [ ](test 命令)

[ ] 用于基本的条件测试,它支持整数比较和文件测试。比较运算符通常使用 <>= 等,但需要使用 -eq-ne-lt-gt 等来进行整数比较。

示例

  1. if [ $a -eq $b ]; then
  2. echo "a is equal to b"
  3. elif [ $a -gt $b ]; then
  4. echo "a is greater than b"
  5. else
  6. echo "a is less than or equal to b"
  7. fi

2. [[ ]](bash 中的条件表达式)

[[ ]] 提供了更丰富的比较运算符,包括正则表达式匹配和字符串比较。它使用 ==!= 等进行字符串比较,而整数比较则使用 -eq-ne-lt-gt

示例

  1. if [[ $string1 == $string2 ]]; then
  2. echo "strings are equal"
  3. elif [[ $num1 -gt $num2 ]]; then
  4. echo "num1 is greater than num2"
  5. fi

3. ( )

括号 ( ) 用于组合命令和子 shell 执行。它们可以与逻辑运算符 &&|| 结合使用,以根据前一个命令的退出状态执行后续命令。

示例

  1. if command1 && command2; then
  2. echo "Both commands succeeded"
  3. fi
  4. if command1 || command2; then
  5. echo "At least one command succeeded"
  6. fi

4. (( ))

(( )) 用于算术扩展和整数比较。它支持常见的算术运算符,如 +-*/%,并且可以在条件表达式中使用。

示例

  1. if (( a > b )); then
  2. echo "a is greater than b"
  3. fi

5. { }

大括号 { } 用于组合多个命令,但它们不会创建新的子 shell,所以其中定义的任何变量更改都会影响当前 shell 环境。

示例

  1. {
  2. command1
  3. command2
  4. }

6. {{ }}

在标准的 shell 脚本中,{{ }} 并没有特殊含义。它们可能被 shell 解析器解释为普通文本,除非在特定的脚本语言或工具中有特殊的用途。

结合使用

这些元素可以组合在一起,以创建复杂的条件表达式。例如,你可以使用 [ ][[ ]] 进行比较,然后使用 ( )&&|| 进行逻辑组合。

示例

  1. if [ -f "$file" ] && [ "$file" != "$backup" ]; then
  2. cp "$file" "$backup"
  3. fi

或者,在 bash 中:

  1. if [[ -f "$file" && "$file" != "$backup" ]]; then
  2. cp "$file" "$backup"
  3. fi

总的来说,理解这些元素如何结合使用是编写健壮和高效 shell 脚本的关键。每种结构都有其特定的用途和限制,因此选择正确的工具对于实现所需的功能至关重要。

shell中各个括号的用法区别的更多相关文章

  1. shell中各种括号的用法

    一.单小括号()1.将某个命令的返回值作为某个变量的值进行传递 #!/bin/bash USER=$(whoami) echo $USER [root@jump ~]# for i in $(seq ...

  2. (转)shell中各种括号的作用()、(())、[]、[[]]、{}

    shell中各种括号的作用().(()).[].[[]].{} 原文:http://www.jb51.net/article/60326.htm http://blog.csdn.net/good_h ...

  3. Shell学习(四)——shell中各种括号的作用

    参考博客: [1]shell中各种括号的作用().(()).[].[[]].{} [2]shell中的单层大/中/小括号.双层大中小括号.命令替换等 一.前言 目录 单括号() 双括号(( )) 单中 ...

  4. 有关shell中冒号的特殊用法

    有关shell中冒号的特殊用法,供朋友们参考. : ${VAR:=DEFAULT} 当变量VAR没有声明或者为NULL时,将VAR设置为默认值DEFAULT.如果不在前面加上:命令,那么就会把${VA ...

  5. shell中的括号(小括号,大括号/花括号)

    在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string ...

  6. shell脚本学习之Bash shell 里各种括号的用法

    今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...

  7. Shell中反引号和$()的区别

    Shell中可以用来实现变量代换的命令有两种,一种是由反引号括起来的一条命令另一种是由$()括起来一条命令,shell先执行这条命令,然后见输出结果立刻代换到当前命令行中. 例如定义一个变量存放dat ...

  8. 书写优雅的shell脚本(五)- shell中(())双括号运算符

    在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构 ...

  9. shell中字典的一个用法示例

    1. shell中字典的用法示例, 数组用法同字典 2. 以上使用sell配合字典实现的功能, 使用awk能轻松搞定, 如下: awk '{print $2}' file.txt | sort | u ...

  10. Linux Shell中有三种引号的用法

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

随机推荐

  1. [PHP] Laravel-admin 模型表格-列的显示-链接: 关联关系的跳转链接

    link 将字段显示为一个链接. // link方法不传参数时,链接的`href`和`text`都是当前列的值 $grid->column('homepage')->link(); // ...

  2. [FAQ] Smart Contract: xxx has not been deployed to detected network (network/artifact mismatch)

    在前端用 web3 与 contract 交互时,需要获取到已部署的 contract 实例进行操作,如果没有获取到就会报此错. 比如如下的 .deployed() 阶段: /* 伪代码 */ con ...

  3. dotnet 8 WPF 支持在 RDP 远程桌面状态下启用渲染硬件加速

    本文将和大家介绍在 dotnet 8 里 WPF 引入的新功能之一,在 RDP 远程桌面状态下启用渲染硬件加速 在 dotnet 8 之前,在用户进行 RDP 远程桌面时 WPF 应用将默认关闭硬件渲 ...

  4. dotnet C# 通过 Vortice 将 ID2D1CommandList 作为特效的输入源

    使用 Direct2D 过程中将可以使用到 Direct2D 强大的特效功能,比如给某些界面绘制内容添加特效支持.本文将告诉大家如何通过 Vortice 将 ID2D1CommandList 作为特效 ...

  5. 读书笔记 为什么要有R5G6B5颜色格式

    在 Windows 下,颜色的格式有很多,我好奇为什么要设计出 R5G6B5 这样的格式?通过阅读一些书和官方的文档,似乎了解了为什么,我在本文记录一下 颜色的格式上,常用的就是 16 位和 32 位 ...

  6. 【股票爬虫教程】我用100行Python代码,爬了雪球网5000只股票,还发现一个网站bug!

    目录 一.爬取目标 二.分析网页 三.爬虫代码 四.同步视频 五.get完整源码 一.爬取目标 您好,我是@马哥python说,今天继续分享爬虫案例. 爬取网站:雪球网的沪深股市行情数据 具体菜单:雪 ...

  7. 【爬虫+情感判定+饼图+Top10高频词+词云图】"王心凌"热门弹幕python舆情分析

    目录 一.背景介绍 二.代码讲解-爬虫部分 2.1 分析弹幕接口 2.2 讲解爬虫代码 三.代码讲解-情感分析部分 3.1 整体思路 3.2 情感分析打标 3.3 统计top10高频词 3.4 绘制词 ...

  8. Linux中典型的文件权限问题

    总结起来说,可以打个比方,目录就像一间上了锁有窗户的屋子.如果你只想看屋子里面有啥,那么只要拥有r权限,不必进入到屋子,透过屋子的窗户就能看到里面的东西:但是如果你想改变屋子里面的物件,或者从屋子里面 ...

  9. vueJs开发音乐播放器第二篇(点击歌单跳出详情页)

    继上一篇开发音乐播放器歌单列表页 (1.使用router定义跳转链接,2. 使用axios得到音乐第三方数据,并渲染到页面上,3.组件之间传值(props)) 1.接下来使用了vue-router路由 ...

  10. 如何提高WordPress的加载速度

    针对wordpress加载速度慢的原因: 1. 由于Wordpress系统默认使用谷歌字体,在国内谷歌域名被屏蔽,所以导致操作反应慢.对于很多商业主题默认使用了谷歌字体.谷歌ajax库.谷歌地图等谷歌 ...