【问题标题】:For Loop List in ShellscriptShell 脚本中的 For 循环列表
【发布时间】:2012-02-24 05:03:49
【问题描述】:

我正在尝试在 shellscript 中做这样的事情:

STEP=5
LIST=[1-$STEP]

for i in $LIST
    echo $i
done

我期望的输出是:

1 2 3 4 5

我可能以前见过这种用法(例如 [A-Z] ),但我不记得正确的语法。感谢您的帮助!

【问题讨论】:

标签: list shell loops for-loop


【解决方案1】:

试试这个。请注意,您使用包含 LF 的 echo 命令。如图所示,使用 echo -n 在同一行获取输出

    STEP=5
for i in `seq 1 $STEP`; do

echo $i

done

【讨论】:

  • 请注意,seq 不是 POSIX 实用程序,可能不可用。 echo -n 永远不应该被使用;改用printf,它可以方便地抑制换行符。
【解决方案2】:

假设这是 bash:

$ echo {1..5}
1 2 3 4 5
$ STEP=5
$ echo {1..$STEP}
{1..5}
$ eval echo {1..$STEP}
1 2 3 4 5

【讨论】:

  • 这很好,直到您在一个名为“1”的文件的目录中运行它,因为一些愚蠢的错字导致重定向。然后 {1..5} 扩展为“1”,您将花费 小时 来尝试诊断问题。 :) 除非您使用 noglob,因为您之前已经这样做过并且再也不想遇到这个问题了。
  • @dannysauer 大括号扩展不是文件名通配符。 echo {1..5} 输出 1 2 3 4 5 是否存在名为 1 的文件。您是否将此与echo [1-5] 混淆了?
  • @dannysauer,自己验证一下:bash 扩展序列已记录在案:gnu.org/software/bash/manual/bashref.html#Shell-Expansions
  • 我可能在想有一次我尝试使用通配符进行字符串比较(想想“{1,2,3}*”),shell 将通配符扩展为匹配的文件名而不是保留通配符,搞砸了比较。或者,也许我正在考虑一个包含带括号的数组索引的变量,或者其他一些随机的东西。
  • 为了面子,我仍然认为在 shell 脚本中打开 noglob 是个好主意——只有在需要基于 glob 的词扩展时才明确禁用它。 ;)
猜你喜欢
  • 1970-01-01
  • 2022-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多