为了重复一个字符 N 次,我们可以使用printf
. 例如,要重复@
20 次,我们可以使用这样的方法:
N=20
printf '@%.0s' $(seq 1 $N)
Run Code Online (Sandbox Code Playgroud)
输出:
@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)
但是,该字符串的末尾没有换行符。我试过将输出管道传输到sed
:
printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'
Run Code Online (Sandbox Code Playgroud)
是否可以printf
在不使用 sed 的情况下通过单个(在输出末尾添加换行符)获得相同的结果?
nez*_*dka 13
printf %.1s @{1..20} $'\n'
Run Code Online (Sandbox Code Playgroud)
外壳首先扩展大括号,这称为“大括号扩展”。
@{1..20}
into@1 @2 @3 ...
等等
然后会输出每个参数的第一个字节,包括最后一个$'\n'
由一个字节组成的参数——换行符
与zsh
:
printf '%s\n' ${(l[20][@])}
Run Code Online (Sandbox Code Playgroud)
(使用l
左填充参数扩展标志。您也可以在r
此处使用右填充)。
当然,您不必使用printf
. 您也可以使用print
or echo
here\n
默认添加 a 。(printf '%s\n' "$string"
可以写成print -r -- "$string"
或echo -E - "$string"
in zsh
,但如果$string
不包含反斜杠且不以 开头-
,则可以简化为print "$string"
/ echo "$string"
)。
如果最终目标是显示填充到屏幕宽度的字符串列表,您应该这样做:
$ lines=(short 'longer text' '???????????')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ???????????
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
??????????? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)
该m
标志导致 zsh 考虑每个字符的显示宽度(例如上面的那些双宽字符(您的浏览器可能不会以完全双宽呈现,但您的终端应该))。
print -rC1 --
就像printf '%s\n'
或print -rl --
每行打印一个元素,除非在没有参数传递给它的情况下(如 when lines=()
),在这种情况下,它不打印任何内容而不是空行)。
一printf
,以换行符结尾,可变大小,适用于破折号、ksh、bash 和 zsh:
$ printf '%*.0s\n' 33 "" | tr " " "@"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)