为什么 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 大括号扩展在某些算术表达式中有效,但在其他算术表达式中无效? 的相关文章

  • 有没有办法在 MacOSX 上使用 Xcode 将 bash shell 脚本与 AppleScriptObjC 应用程序一起打包?

    我正在尝试使用 AppleScriptObjC 作为包装器来自动化三个或四个 bash shell 脚本 这将为我提供一个友好的 GUI 前端来选择数据文件等 以及方便的文本文件操作和多个 bash 脚本的处理 一切正常 我可以按下按钮并运
  • Linux Bash - 日期格式

    我的日期格式是 yyyy mm dd hh mm ss 如何检查我的输入 它应该是这样的 bin bash read p Date format yy mm dd HH MM SS input check date Y m d H M S
  • 比较两个文件的各自字段并以特定格式输出所需的内容

    我正在比较两个文件 food1 txt 文件并比较 food2 txt 文件 如下所示 cat food1 txt pizza 1ea chicken 5ea tooboo 4ea orange 2ea cat food2 txt pizz
  • sed:替换文本块

    我有一堆文件 从一段代码开始 我试图用另一个代码块替换 Replace
  • 如何在 Mac OS X 中通过给出进程名称来获取进程的 PID?

    我正在编写一个脚本来监视任何给定进程的 CPU 和 MEM 为此 我需要将要监视的进程的名称作为命令行参数发送 例如 monitorscript
  • 为什么 bash for 循环出错?

    我正在尝试使用 for 循环运行以下代码 但出现语法错误 请帮忙 输入格式 输入的第一行包含一个整数N 表示整数的个数 下一行包含 N 个空格分隔的整数 它们构成数组 A read n sum 0 for i 1 i lt n i do r
  • 如何在 Linux Bash 中通过 SFTP 将数据传输到远程文件而不将数据存储在本地文件中?

    我需要能够通过 SFTP 将数据从内存传输到远程文件 我最初是通过 SSH 进行此操作的 在工作时发现我没有对远程位置的 SSH 访问权限 只有 SFTP 访问权限 下面是我的原始 SSH 代码的示例 echo secret data ss
  • 如何防止 Conda 默认激活基础环境?

    我最近在我的 Mac 上安装了 anaconda2 默认情况下 Conda 配置为在我打开新的终端会话时激活基本环境 我想要访问 Conda 命令 即我想要将 Conda 的路径添加到我的 PATHConda 在初始化时会执行此操作 所以没
  • 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

    例如 此行失败 nohup for i in mydir fasta do myscript sh i done gt output txt bash syntax error near unexpected token do 正确的做法是
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • sed:用匹配的模式替换第 n 个单词?

    我有一个具有以下特征的文本文件 每行至少有三个由空格分隔的 单词 单词 可以是任何字符或字符串 我在一些行中附加了一些注释 并提出了对原始单词进行更改的初步建议 现在想使用 sed 为我进行这些更改 因此 为了提供更清晰的图片 我的文件如下
  • shell脚本响应按键

    我有一个 shell 脚本 本质上是这样的 while true do read r input if input a then echo hello world fi done 这一切都很好 但我刚刚意识到在这种情况下必须按 ENTER
  • 删除所有出现的重复行

    如果我想删除某些字段重复的行 那么我使用 sort u k n n 但这仍然发生一件事 如果我想删除所有出现的重复项 有没有快速的 bash 或 awk 方法可以做到这一点 例如我有 1 apple 30 2 banana 21 3 app
  • 寻找 shell 重定向交错行为的解释

    给定以下脚本 t sh bin bash if eq 0 then log if gt 0 then printf s n else cat fi tee a logged out else log if gt 0 then printf
  • 如何在shell脚本中运行R代码?

    我有一个 R 文件 myfile R 我想使用 shell 脚本来运行它 我怎样才能做到这一点 我试过这个 bin bash Rscript myfile R 但它给了我这个错误 Rscript 找不到命令 我也尝试过这个 bin bash
  • VBA:如何从 MS Access 运行另一个应用程序

    我一直在试图解决这个问题 但似乎我在任何地方都找不到解决该问题的方法 这是第一部分 VBA Shell 命令始终返回 找不到文件 https stackoverflow com questions 10439024 vba shell co
  • 错误:选项“Z”仅在夜间编译器上被接受[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在通过斯坦福操作系统课程 cs140e https web stanford edu class cs140e 其中一个问题是 有一个名
  • PS1 定义中的条件 pwd

    我想显示当前工作目录如果我处于symlink比没有 到目前为止我已经 pwd P pwd echo 1 31m pwd P echo 1 32m pwd 将返回所需的输出 但它不能替代 w在命令提示符下 我尝试用反引号括起来 但这只会导致p
  • 为什么 sed 将替换文本放在行首?

    在 Mac OS X bash 上 我在命令行中使用以下 sed sed s S 1 file1 txt gt file2 txt file1 txt有这样的行 some path to somewhere some stuff here

随机推荐

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

    我想编写一个函数 让我分派传入的泛型类型 我不关心运行时值 只关心编译时类型 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 在此版本中 我没有遇到任何