首页 > 解决方案 > 如何在本机 POSIX shell 脚本中乘以一个字符或字符串?

问题描述

这不是另一个问题的重复,原因有两个。该问题没有指定答案必须是 POSIX。该问题的标记答案无法在 Dash shell 中正确运行。(我不知道如何判断答案是否是 POSIX,但它没有在最新版本的 Dash 上运行。

澄清一下,我只想使用 POSIX shell 内置函数。我应该更清楚地说明这一点。据我所知,seq 是一个 GNU 实用程序,这意味着我必须生成一个外部程序。我不想产生任何外部程序。

我想知道在 shell 脚本中乘以字符串的最有效方法。例如,脚本将执行如下...

./multiplychar "*" "5"
*****
./multiplychar "*" "1"
*
./multiplychar "*" "0"

# It would not output anything

我似乎再也找不到它了,但我很久以前就为bash找到了这个问题。然而,所有的答案要么使用了像 Perl ex 这样的外部程序,要么使用了perl -E "print '$' x $2"bashisms。

我想知道如何在 POSIX shell 中本地完成此操作。我正在使用破折号。如果有多种方法,如果出于效率考虑,我将处理小于 100 的小数字。(这是一个严格基于文本的音量条通知的脚本。)

外壳:破折号

操作系统:Arch Linux

标签: shellposixdash-shell

解决方案


我发现的最短的几乎是这样的,没有循环,没有seq

(根据 MemReflect 的评论编辑)

$ printf "%9s" ' ' | tr ' ' x 
xxxxxxxxx

所以你可以这样做:

#!/bin/sh
if [ $2 -eq 0 ]; then
    exit
fi
printf "%${2}s\n" ' ' | tr ' ' "$1"
$ ./multiplychar "*" "5"
*****
$ ./multiplychar "*" "1"
*
$ ./multiplychar "*" "0"
$

推荐阅读