我想重复#
10次,例如:
"##########"
我如何在Bourne shell(/bin/sh
)中执行此操作?我尝试过使用print
,但我想这只适用于bash shell。
请不要提供bash语法。
答案 0 :(得分:3)
shell本身没有重复字符串的明显功能。只有十次重复,很难击败明显的
echo '##########'
为了重复指定次数的单个字符,即使在忙碌的BusyBox上也应如此。
dd if=/dev/zero bs=10 count=1 | tr '\0' '#'
不是很优雅,但开销相当低。 (您可能需要从dd
重定向标准错误以摆脱讨厌的进度消息。)
如果您的文件足够长(例如,您当前正在运行的脚本),则可以使用tr
替换前10个字符。
head -c 10 "$0" | tr '\000-\377' '#'
如果您有一个非常传统的用户空间(head
不支持-c
选项),那么1980年代兼容的变体可能
yes '#' | head -n 10 | tr -d '\n'
(您的tr
可能不完全支持我在此处使用的反斜杠序列。请查看其手册页或您当地的学术程序员,从20世纪70年代后期开始。)
......或者,哎呀
strings /bin/sh | sed 's/.*/#/;10q' | tr -d '\n' # don't do this at home :-)
在没有外部实用工具的纯传统Bourne shell中,你可以做得比
更好for f in 0 1 2 3 4 5 6 7 8 9; do
printf '#'
done
在一般情况下,如果你能想出一个生成(至少)所需的重复次数的生成器表达式,你可以循环它。这是seq
和jot
的简单替代:
echo | awk '{ for (i=0; i<10; ++i) print i }'
但是你也可以从Awk输出:
echo | awk '{ for (i=0; i<10; ++i) printf "#" }'
答案 1 :(得分:2)
嗯,纯粹的Bourne Shell(POSIX)解决方案,可能没有管道和叉子
i=0; while test $i -lt 10; do printf '#'; : $((++i)); done; printf '\n'
这很容易推广到其他重复的字符串,例如一个shell函数
rept () {
i=0
while test $i -lt $1; do
printf '%s' "$2"
: $((++i))
done
printf '\n'
}
rept 10 '#'
如果HP Bourne Shell不完全POSIX且不支持使用: $(())
进行算术替换,则可以使用i=$(expr $i + 1)
代替。
答案 2 :(得分:1)
您可以将此技巧用于printf
:
$ printf "%0.s#" {1..10}
##########
如果数字可以是变量,那么您需要使用seq
:
$ var=30
$ printf "%0.s#" $(seq $var)
##############################
答案 3 :(得分:0)
这会打印##########
:
for a in `seq 10`; do echo -n "#"; done