Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何在Bourne Shell中重复角色?_Unix_Sh - Fatal编程技术网

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的功能。如果您没有GNU
coreutils
,您有什么?一个常见的*BSD替代品是
jot
。不确定,我正在使用HP NONSTOP\u内核,如何检查它?内核并不决定您安装了哪些实用程序。如果这是一个非常有限的环境,也许你应该在你的问题中提到这一点。我很抱歉没有说清楚,但是有没有其他方法可以实现这一点?太好了!不幸的是,
{1..10}
语法是一个Bash扩展。哦,是吗?我不知道在哪里检查这个…那么,
seq
应该可以。
$ printf "%0.s#" {1..10}
##########
$ var=30
$ printf "%0.s#" $(seq $var)
##############################