Bash - 同一行中的数字序列

Sal*_*cio 29 bash seq

我知道seq生成整数序列的命令,每行一个,但我想问两个问题:

  1. 是否可以将序列的编号写在同一行中?

  2. 是否可以创建由空格分隔的数字序列组成的字符串?

cuo*_*glm 34

使用bash,zshksh93,您可以使用{start..end..step} 大括号扩展形式

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 25

GNUseq采用分隔符 ( -s) 选项:

$ seq -s ' ' 1 5
1 2 3 4 5

$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)


小智 15

可移植到所有 shell 和任何具有 seq 的系统(因为此问题已标记)

如果开始是 1:

$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

除此以外:

$ echo $(seq 5 10)
5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

与公元前:

$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
Run Code Online (Sandbox Code Playgroud)

在 bash 中

echo {1..10}
Run Code Online (Sandbox Code Playgroud)

笔记:

如果 IFS 的值包含换行符(默认情况下),则此回显解决方案有效。
默认情况下 IFS 设置为序列<space><tab><newline>。并且为外壳的每次干净启动而重置。但是,如果您担心在某些极端情况下它可能会发生变化,我们有几种解决方案。

在 bash、zsh、ksh 下只需使用: IFS=$' \t\n' (跳过此答案的所有其余部分)。


但是,在 sh 下重置 IFS 的值可能很复杂,请在此处阅读完整的详细信息

取消设置 IFS。

$ unset IFS; echo $(seq 5 10)                           #Always work.
Run Code Online (Sandbox Code Playgroud)

将永远工作。前提是下面没有代码(或子脚本)需要 IFS 设置,例如执行OldIFS="$IFS".

正确的解决方案。

使用sh的技巧

sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd'  # correct.
Run Code Online (Sandbox Code Playgroud)


Cyr*_*rus 4

用这个:

string="$(seq -s " " 1 10)"
Run Code Online (Sandbox Code Playgroud)