如何在Bourne Shell中重复一个角色?

时间:2015-01-28 11:29:08

标签: unix sh

我想重复# 10次,例如:

"##########" 

我如何在Bourne shell(/bin/sh)中执行此操作?我尝试过使用print,但我想这只适用于bash shell。

请不要提供bash语法。

4 个答案:

答案 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

在一般情况下,如果你能想出一个生成(至少)所需的重复次数的生成器表达式,你可以循环它。这是seqjot的简单替代:

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