【问题标题】:Arithmetic operations in for loop [duplicate]for循环中的算术运算[重复]
【发布时间】:2015-11-12 21:17:47
【问题描述】:

我有一个 C++ 代码,我想将它转换成 POSIX sh 代码:

for(int j=(i-(i%9)); j<((i-(i%9))+9); j++)
{
    ...
}

我的问题是如何将 lopp 的这个转换成 POSIX shell? 这不起作用:

for j in {{$i-($i%9)..{($i-(i%9)+9)}}
do
    echo $j;
done

【问题讨论】:

  • 不要在代码中包含图像——复制/粘贴实际文本。这样一来,StackOverflow 自己的语法突出显示就可以工作,使用屏幕阅读器或基于文本的浏览器的人实际上可以阅读您的问题(而且,即使指向您的图像的链接断开,问题仍然可用)。
  • ...此外,即使是硬编码的数字,{{1..9}} 类型的大括号扩展也是一种拙劣的做法,不能保证在 /bin/sh 中可用。

标签: shell


【解决方案1】:

如果您的 shell 是 /bin/bash(如问题最初指出的那样),那么由于 bash supports C-style for loops,所做的更改比您认为需要的要少得多。某些版本可能会使用更压缩的语法,但为了跨解析器版本安全,建议使用大量空格:

for (( j = ( i - ( i % 9) ); j < ( ( i - ( i % 9 ) ) + 9 ); j++ )); do echo "$j"; done

相比之下,/bin/sh

j=$(( i - ( i % 9 ) ))
while [ "$j" -lt "$(( ( i - ( i % 9 ) ) + 9 ))" ]; do
  echo "$j"
  j=$(( j + 1 ))
done

至于您最初的尝试,大括号扩展发生在解析过程的早期——在评估任何变量的值之前;因此,它们不能与任何非静态数字一起使用。

【讨论】:

  • 得到一个意外的 EOF ")" prntscr.com/9231r7
  • 你的 shell 真的是 bash 吗?如果是#!/bin/sh,那就是不同的shell。
  • 另外,不要使用图片链接:我不能从它们复制/粘贴来测试,任何重新输入都有引入错误的空间。
  • 是的,它是#!/bin/sh 样式
  • 如果您的问题是关于/bin/sh,而不是bash,请编辑您的问题以不再使用bash
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
相关资源
最近更新 更多