unix - 如何在 Bourne Shell 中重复一个字符?

标签 unix sh

我想重复 # 10 次,比如:

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

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

请不要给出 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 选项)一个 1980 年代兼容的变体可能是

yes '#' | head -n 10 | tr -d '\n'

(您的 tr 可能不完全支持我在这里使用的反斜杠序列。请查阅它的手册页或您本地 1970 年代后期的学术程序员。)

...或者,见鬼

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 "#" }'

关于unix - 如何在 Bourne Shell 中重复一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28191126/

相关文章:

linux - 客户端能否确定服务器是否具有 accept() 的 unix 套接字?

linux - 如何使用 bash 在空文件的某些行上存储特定数据

linux - 如何使用 xargs 删除 iptables 规则?

linux - Linux,如何使用Shell脚本进行文件操作?

jenkins - 在流水线 SH 脚本中使用 Jenkins 环境变量

unix - 使用一个 pthread_mutex_t 和多个 pthread_cond_t 和 pthread_cond_wait()

linux - 使用 bash 从手册页中为给定的退出代码拉出特定行

linux - 在 *nix 系统中创建临时命名的 fifo

bash - 将命令的输出分配给变量

bash 多个 heredocs 等