为什么 bash 大括号扩展在某些算术表达式中有效,但在其他算术表达式中无效?

2023-12-03

我正在编写一个非常简单的 bash 脚本,但我无法理解为什么已弃用的 $[] 可以完美地工作,而 $(()) 似乎破坏了整个事情。

我所指的代码是:

for i in {1..10};
do 
    printf %4d $[{1..10}*i]
    echo
done

在此版本中,我没有遇到任何问题,但我不想使用已弃用的 bash 元素,这就是我想切换到 $(()) 的原因。

不幸的是,一旦我将代码更改为:

printf %4d $(({1..10}*i))

我收到一个错误:

./script_bash.sh: line 8: {1..10}*i: syntax error: argument expected (error token is "{1..10}*i")

我会很感激在这方面提供一些帮助......


将机器设置为 1990 年。

Bash 实现了$[]语法符合 POSIX P1003.2d9(大约 1990 年),这是已发布的 P1003.2-1992 的草案。在草案和标准之间的两年里,POSIX 转而选择了 ksh88$(())语法和行为。 Chet Ramey(bash 维护者)这样说,早在2012年:

Bash...实现了 $[...] 因为没有其他 当时的语法,并获得一些操作经验 shell 中的算术扩展。 Bash-1.14...列出了算术展开的两种形式,但是通过 bash-2.0发布的时候是1995年,手册中只提到了 $((...)) 形式。

这向我表明$[]形式是实验性的,并且它具有某些行为(例如大括号扩展),当 POSIX 采用$(())句法。这些实验行为被保留下来,因为已经有依赖它们的脚本(记住已经过去了两年多)。

切特在同一条线索中明确表示$[]形式已过时,但并未弃用:

现在,继续使用 $[...] 语法几乎没有任何问题。 只需要几十个字节的代码。我没有删除它的计划。

The 当前 POSIX 标准,C.2.6 字扩展 > 算术扩展提到语法(强调我的):

在早期的提案中,使用了 $[表达式] 形式。它在功能上相当于当前文本的“$(())”,但有人提出反对意见,认为 1988 年的 KornShell 已经实现了“$(())”,并且没有令人信服的理由发明另一种语法。此外,“$[]”语法在涉及 case 语句中的模式时存在轻微的不兼容性。

因此,bash 中实现的行为并不完全符合规范,但由于没有计划删除它,如果它能巧妙地解决您的问题,我认为没有理由放弃它的好处。然而,正如 @Barmar 的评论所指出的,评论代码并将其链接到此处是一个好主意,这样未来的开发人员就知道你到底是什么意思!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 bash 大括号扩展在某些算术表达式中有效,但在其他算术表达式中无效? 的相关文章

随机推荐

  • 根据泛型类型调度不同的函数

    我想编写一个函数 让我分派传入的泛型类型 我不关心运行时值 只关心编译时类型 const value any const x DateTime parseAs
  • 在 C++ 中以特定间隔速率调用方法

    这真的让我很恼火 因为我以前做过 大约一年前 我一辈子都不记得那是什么图书馆了 基本上 问题是我希望能够以指定的时间间隔调用某个方法一定次数或一定时间段 一个例子是我想从现在开始调用方法 x 10次 每0 5秒一次 或者 从现在开始调用方法
  • 当我们删除一个项目时,字典会调整大小吗?

    在Python中 当我们从字典中删除一个项目时 字典会调整大小还是重建字典表 从一些网站和博客中我了解到 当我们从字典中删除一个项目时 Python会在删除的键中插入一个虚拟键来填充字典条目 稍后 Python将通过调用一些清理函数来清理虚
  • 密钥库类型:使用哪一种?

    通过查看文件java security of my JRE 我看到默认使用的密钥库类型设置为JKS Here 有一个可以使用的密钥库类型的列表 有推荐的密钥库类型吗 不同密钥库类型的优点 缺点是什么 与您链接到的标准名称列表中列出的类型相比
  • 缩放以显示 bing 地图中的所有位置

    假设我有 3 个图钉 1 加利福尼亚州 2 佛罗里达州 3 纽约 为了让这三个人都可见 我必须缩小到足够远才能看到整个国家 但可以说我有 1 加利福尼亚州 2 内华达州 3 德克萨斯州 我必须缩小才能覆盖美国的西南角 Windows Pho
  • Derby 数据库表列名称格式在查询中不一致

    当查询 Derby 数据库时 我发现对于某些表 我必须双引号列名并使用表名来限定列名 但对于其他一些表 我不需要 这些表会发生什么 如何使所有表相同并且可以在没有双引号和表名限定符的情况下查询它们 我正在使用 NetBeans IDE 的
  • d3.js V3 力定向图和未链接的节点

    我正在做我的第一个数据可视化项目 更多的是为了练习 学习 d3 js 因为数据可视化是我感兴趣的 我的第一个项目是制作力向图 该数据集是与其毗邻州相关的 50 个州 源是州 目标是边界州 夏威夷和阿拉斯加没有接壤的州 如果我在 csv 文件
  • 无法在 NetBeans IDE 中建立与 MySQL 的连接

    当我使用 Hibernate 创建新的 Web 项目时 我打开新建连接向导 选择 MySQL 连接器 J 驱动程序 选项 连接器 jar 出现在驱动程序文件列表中 按下一步按钮 设置主机 127 0 0 1 端口 3306 数据库名称 用户
  • 单击时关闭菜单

    我想通过单击链接或单击菜单外部来关闭菜单 为了让事情变得美好和轻松 我不想使用 jQuery 我该怎么做
  • 如果 Int 不能为 null,那么 null.asInstanceOf[Int] 是什么意思?

    作为测试 我写了这段代码 object Ambig extends App def f x Int println Int def f x String println String f null asInstanceOf Int f nu
  • 乳胶打印单斜杠、反斜杠r、反斜杠n

    我希望 tex 文件中的以下行 按原样 打印 while tmp 0 r tmp 0 n tmp 当我将它包装在 verb 命令中时 如下所示 verb while tmp 0 r tmp 0 n tmp 它不起作用 我得到 Undefin
  • MS Access:将参数从一种访问形式传递到另一种访问形式

    我有一个表格和一个按钮 我想通过单击按钮打开另一个表单 并将参数从父表单传递到子表单 子表单的 RecordSource 有参数 我该怎么做 您可以通过引用表单的对象来引用调用表单的任何属性 我不会用 表单属性的符号 我讨厌它 所以如果你想
  • Reportlab - 将两个段落添加到一个表格单元格中

    我有一个表 其构建如下 styleN styles Normal data table row ID Some Information data append table row table row table row append Par
  • 动态添加后突出显示表格行

    看看如何在使用 jquery 动态添加表行后突出显示它 我的代码似乎添加行没有问题 但它没有突出显示正确的行 jquery opponents tr last after tr td data td td more data td tr e
  • 正则表达式删除单行 SQL 注释 (--)

    问题 谁能给我一个可以从 SQL 语句中删除单行注释的有效正则表达式 C VB NET 我的意思是这些评论 This is a comment 不是那些 this is a comment 因为我已经可以处理明星评论了 我做了一个小解析器
  • 如何在 TypeScript 中向日期、字符串、数组、数字等添加方法

    如何告诉 TypeScript 对日期 数字 字符串等本机类型的添加 例如 我想要编译以下内容 示例来自http sugarjs com dates var date Date Date create tomorrow I get a co
  • 如何重定向到子文件夹,然后将子文件夹链接重写到 htaccess 中的根目录?

    如果这个问题是重复的 我很抱歉 但我在网上查找的所有内容都让我很困惑 所以我再次发布这个问题来指定我的需求 因为我希望我的网站结构干净 所以我想将内容与配置分开 所以我将所有页面放在 app文件夹 很像 Rails 应用程序 网站的结构大致
  • AVX 与 SSE:预计会有更大的加速

    我预计 AVX 的速度比 SSE 快 1 5 倍左右 所有 3 个数组 3 个数组 16384 个元素 4 字节 元素 196608 字节 应适合 Intel Core CPU Broadwell 上的 L2 缓存 256KB 我应该使用任
  • Windows 中相当于 sys/select.h 和 termios.h 中定义的功能的是什么

    我在linux下有一个应用程序 编译成功 我想在 Windows 中运行相同的程序 但编译会产生以下与头文件相关的错误 找不到 sys select h 找不到 termios h 我怎样才能解决这个问题 Windows API 在结构和风
  • 为什么 bash 大括号扩展在某些算术表达式中有效,但在其他算术表达式中无效?

    我正在编写一个非常简单的 bash 脚本 但我无法理解为什么已弃用的 可以完美地工作 而 似乎破坏了整个事情 我所指的代码是 for i in 1 10 do printf 4d 1 10 i echo done 在此版本中 我没有遇到任何