【问题标题】:Bash for loop with a variable [duplicate]带有变量的Bash for循环[重复]
【发布时间】:2019-04-11 10:32:21
【问题描述】:

我正在尝试在 bash 中编写 for 循环,以便我可以将数字从 1 迭代到大于 10 的数字。在数字只有一位的情况下,应在其左侧添加零(如01)。

我找到的解决方案是这样的:

for i in 0{1..9} {10..43}; do
        echo "stuff$i.txt"
done

这可行,但我想将上限作为变量,所以我尝试了这个:

max_test=43

for i in 0{1..9} {10..$max_test}; do
        echo "stuff$i.txt"
done

运行时,脚本会打印出来

stuff01.txt

stuff02.txt

...

stuff09.txt

stuff{10..43}.txt

我找到了this answer,但在我的情况下,由于该一位数条件,我需要 2 个for 循环。做我想做的事的最佳方式是什么?

提前谢谢你

【问题讨论】:

  • 这是一个重复的问题吗?我的问题是没有将变量作为迭代的上限,它是根据问题中解释的上下文这样做的。
  • 我看到了您的编辑,-w 确保了 0 填充,因此您可以只使用一个 $(seq -w 1 "$max_test")
  • 首先,{01..43} 将为您提供用零填充的两位数,至少在 bash 4 及更高版本中(例如,尝试:echo {0005..12})。其次,您现在知道大括号扩展是在其他任何事情之前评估的(如 bash 手册页的“EXPANSION”部分的第二段所述)。您可以使用eval(例如eval "echo {05..$n}")或算术(for ((i=5;i<=n;i++)); do printf '%02d ' $i; done)来解决这个问题。

标签: bash


【解决方案1】:

您不能在大括号扩展中使用变量,因为大括号扩展是在变量扩展之前完成的。例如,您可以使用seq

max=43
seq -w 1 "$max"

【讨论】:

  • 请注意,这不是一个 bash 答案,并且不能保证在包含 bash 的每个系统上都安装 seq 实用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多