【问题标题】:How in OS/X to get 'seq' command-line functionality?如何在 OS/X 中获得“seq”命令行功能?
【发布时间】:2013-12-04 18:20:27
【问题描述】:

我仍在使用 Snow Leopard(我知道...),所以如果这在 OS/X 的更高版本之一中已修复,请原谅,但我想做标准的“seq”又名:

for i in `seq 1 100` ; do
  cat /whatever > $i.txt ;
done

我认为安装 GNU 工具可以做到这一点,但显然不是。

【问题讨论】:

  • for i in {1..100} 对你有用吗?
  • 您可能可以使用$(command) 而不是我懒得弄清楚如何在评论中显示的反引号语法。读起来容易一些,而且可以嵌套。

标签: macos shell gnu sequences seq


【解决方案1】:

在我的 Mac 上,这两项工作 (OS X 10.8.5)

Andreas-Wederbrands-MacBook-Pro:~ raven$ for i in {1..10}; do echo $i; done
1
2
3
4
5
6
7
8
9
10
Andreas-Wederbrands-MacBook-Pro:~ raven$ for i in `seq 1 10`; do echo $i; done
1
2
3
4
5
6
7
8
9
10

【讨论】:

  • 看起来您使用的是更新版本的 OS/X。我得到“找不到 seq 命令”,但是,{1..10} 有效!谢谢!
  • OS X 10.5 没有seq。 OS X 10.5 是 PowerMac (PowerPC) 的最后一个版本。雪豹是 OS X 10.6。它适用于英特尔。
【解决方案2】:

在 Snow Leopard 中,您可以使用 jot 命令,该命令可以生成类似 seq 的顺序数据(以及更多信息,请参阅手册页了解详细信息)。

$ jot 5
1
2
3
4
5
$ jot 3 5
5
6
7

【讨论】:

  • jot 是否符合标准? (当然,seq 也不是,但最好向人们指出无论他们的外壳在哪里都可以使用的工具)。
  • 我认为没有符合标准的答案; POSIX 中没有大括号扩展和 C 样式循环。 jot 很高兴知道,因为它是 OS X 10.6 中可用的 seq 等效程序(seq 本身附带 10.8+,也许还有 10.7)。无论如何,接受的答案和你的答案都很好地涵盖了bash 选项。
  • 确实覆盖了答案底部附近的 POSIX 选项;这是第三个代码块。
  • 对于好奇的人。 jot 是一个 BSD 实用程序。适用于所有 BSD 系统以及从中借用的任何系统(例如 OSX)。 AFAIK 它在任何其他 UNIX 系统(Solaris、AIX 等)或 Linux 上都不可用,尽管它通常可以作为包安装。不幸的是,GNU 人创建了 seq(1),而不是采用/复制已经存在多年的 jot...
  • 我似乎无法让jot0.1 的步长倒数。结果是 jot: bad precision value。它是否允许十进制值的递增/递减?手册页似乎并不清楚。
【解决方案3】:

不需要seq 之类的工具——bash(如 ksh 和 zsh)具有内置语法:

# bash 3.x+
for ((i=0; i<100; i++)); do
  ...
done

...或者,对于 bash 2.04+、zsh 和 ksh93:

i=0; while ((i++ <= 100)); do
   ...
done

...或者,对于任何符合 POSIX 标准的外壳:

while [ $(( ( i += 1 ) <= 100 )) -ne 0 ]; do 
  ...
done

bash 还支持 {0..100} 等扩展,但不支持将变量作为端点,而 for 循环语法更灵活。

【讨论】:

  • i=20.0; while [ $(( ( i -= 0.1 ) &gt;= 1.0 )) -ne 0 ]; 结果为 syntax error: invalid arithmetic operator (error token is ".0")。 Bash 是 GNU bash, version 3.2.17(1)-release (powerpc-apple-darwin9.0)
  • @jww,当然可以; bash 只有整数数学。不能保证seq 也提供浮点——在几个平台上它不提供。
  • 但是seq 允许我们这样做:for i in $(seq -f "%.1f" 20.0 -0.1 1.0)
  • @jww,不是所有版本的seq。 (这不是一个标准化的命令,所以这不足为奇)。
  • ...虽然查看常见的实现,但 比我想象的更广泛可用的功能。如果有大量需求,用于模拟它的正确工具可能是awk
【解决方案4】:

或者,只需将其添加到您的 bash 个人资料中:

function seq {
  if [ $1 > $2 ] ; then
    for ((i=$1; i<=$2; i++))
      do echo $i
    done
  else
    for ((i=$1; i>=$2; i--))
      do echo $i
    done
  fi
}

没那么难。

【讨论】:

  • 在这里使用[ $1 &gt; $2 ] 是错误的——它实际上是一个重定向(到$2 中命名的文件),而不是数学比较。请改用 (( $1 &gt; $2 )),因为您已经假设使用 bash-only 语法,或者使用 [ "$1" -gt "$2" ] 以获得更便携的东西。
  • ...谈到 bash-only 语法,请考虑避免使用 function 关键字。 seq() { 是 POSIX 定义的声明函数的方式,因此如果您需要编写可移植代码,这是一个更好的习惯。
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 2014-04-21
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多