Unix 如何在Bourne Shell中重复角色?
我想重复Unix 如何在Bourne Shell中重复角色?,unix,sh,Unix,Sh,我想重复#10次,比如: "##########" 我如何在Bourne shell(/bin/sh)中执行此操作?我尝试过使用print,但我想它只适用于bashshell 请不要给出bash语法。这将打印。: shell本身没有明显的重复字符串的功能。仅仅重复十次,就很难击败明显的错误 echo '##########' 要将单个字符重复指定的次数,即使在繁忙的BusyBox上也应该可以 dd if=/dev/zero bs=10 count=1 | tr '\0' '#' 不是很优
#
10次,比如:
"##########"
我如何在Bourne shell(/bin/sh
)中执行此操作?我尝试过使用print
,但我想它只适用于bashshell
请不要给出bash语法。这将打印。
:
shell本身没有明显的重复字符串的功能。仅仅重复十次,就很难击败明显的错误
echo '##########'
要将单个字符重复指定的次数,即使在繁忙的BusyBox上也应该可以
dd if=/dev/zero bs=10 count=1 | tr '\0' '#'
不是很优雅,但开销相当低。(您可能需要将标准错误从dd
重定向,以消除讨厌的进度消息。)
如果您有一个保证足够长的文件(例如,您当前正在运行的脚本),则可以将前10个字符替换为tr
head -c 10 "$0" | tr '\000-\377' '#'
如果您有一个非常传统的用户空间(例如,head
不支持-c
选项),那么可能需要一个80年代兼容的变体
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 }'
echo | awk'{for(i=0;i好吧,没有管道和叉子的纯伯恩壳(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)
。您可以将此技巧与printf
一起使用:
$ printf "%0.s#" {1..10}
##########
如果数字可以是变量,则需要使用seq
:
$ var=30
$ printf "%0.s#" $(seq $var)
##############################
perl-e'print“#”x10'
maybe?echo | awk'{for(i=0;iError:/bin/-sh:seq:未找到。我正在处理Bourne shell(/bin/sh),上面的语法行得通吗?seq
是一个相当标准的实用程序。它不是您的shell的功能。如果您没有GNUcoreutils
,您有什么?一个常见的*BSD替代品是jot
。不确定,我正在使用HP NONSTOP\u内核,如何检查它?内核并不决定您安装了哪些实用程序。如果这是一个非常有限的环境,也许你应该在你的问题中提到这一点。我很抱歉没有说清楚,但是有没有其他方法可以实现这一点?太好了!不幸的是,{1..10}
语法是一个Bash扩展。哦,是吗?我不知道在哪里检查这个…那么,seq
应该可以。
$ printf "%0.s#" {1..10}
##########
$ var=30
$ printf "%0.s#" $(seq $var)
##############################