如何使用 seq(1) 以相反的顺序显示数字?

mtk*_*mtk 48 command-line seq

我以各种顺序迭代数字。我能够以递增的顺序显示它们,即使是这样的步骤:

$ seq --separator="," 1 10
1,2,3,4,5,6,7,8,9,10
$ seq --separator="," 1 2 10
1,3,5,7,9
Run Code Online (Sandbox Code Playgroud)

我也能够以相反的顺序显示它们,既不是连续的也不是逐步的。

$ seq --separator="," 10 1   
$ seq --separator="," 10 2 1
Run Code Online (Sandbox Code Playgroud)

上述命令没有输出。

我的外壳详细信息:

$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

让我知道如何以降序显示数字?

小智 62

使用负增量

seq -s, 10 -2 1
10,8,6,4,2
Run Code Online (Sandbox Code Playgroud)


Chr*_*own 26

通常,您不想使用seq,它不可移植(即使在标准 Linux 环境中也是如此)。如果您使用 ksh、zsh 或 bash4+,则可以使用大括号扩展:

echo {10..1..2} | tr " " ,
10,8,6,4,2
Run Code Online (Sandbox Code Playgroud)

  • 甜蜜的答案,但是当您指出 `seq` 是非标准的,然后使用 bash-4-only 大括号扩展时,有一些讽刺意味。;) (22认同)
  • 这是简短而快速的,但我使用的是较旧的 bash 版本。 (2认同)

rus*_*ush 15

纯 bash、ksh 或 zsh 的另一种方式:

for ((i=10;i>0;i-=2)) ; do echo -n "$i," ; done
Run Code Online (Sandbox Code Playgroud)

纯 POSIX sh 方式:

i=10
while [ "$i" -gt 2 ]; do printf "$i,"; i=$((i-2)); done
echo "$i"
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 7

现在,标准 POSIX 的:

awk 'BEGIN{for (i = 10; i > 0; i -= 2) print i}' | paste -sd , -
Run Code Online (Sandbox Code Playgroud)

(有趣的是,mawk(并且在较小程度上gawk)比 GNU 快得多seq,i = 10000000而不是i = 10)

或者

i=10; set --
while [ "$i" -gt 0 ]; do
  set -- "$@" "$i"
  i=$(($i - 2))
done
IFS=,
echo "$*"
Run Code Online (Sandbox Code Playgroud)

(只会在迭代次数较少时更有效,尤其是使用bash)

或者

echo 'for(i=10;i>0;i-=2) i' | bc | paste -sd , -
Run Code Online (Sandbox Code Playgroud)

(这将支持任何大小的数字,但请注意,超过一定数量的数字(至少在 POSIX 语言环境中大于 10 70的数字),行将用反斜杠包裹)


小智 5

尝试:

   seq [OPTION]... FIRST INCREMENT LAST
Run Code Online (Sandbox Code Playgroud)

例子:

$ seq 10 -1 1