在bash中重复打印字符
是否有一种方法可以在bash中重复打印相同的字符,就像您可以在python中使用此构造一样:在bash中重复打印字符,bash,shell,Bash,Shell,是否有一种方法可以在bash中重复打印相同的字符,就像您可以在python中使用此构造一样: print('%' * 3) 给予 这很难看,但你可以这样做: $ for a in `seq 5`; do echo -n %; done %%%%% echo $(yes % | head -n3) for ((i=0; i<3; i++)){ echo -ne "%" } s=$( printf "%3s" ); echo " ${s// /%}" 当然,seq是一个外部程序
print('%' * 3)
给予
这很难看,但你可以这样做:
$ for a in `seq 5`; do echo -n %; done
%%%%%
echo $(yes % | head -n3)
for ((i=0; i<3; i++)){
echo -ne "%"
}
s=$( printf "%3s" ); echo " ${s// /%}"
当然,seq
是一个外部程序(您可能有)。我喜欢这样:
$ for a in `seq 5`; do echo -n %; done
%%%%%
echo $(yes % | head -n3)
for ((i=0; i<3; i++)){
echo -ne "%"
}
s=$( printf "%3s" ); echo " ${s// /%}"
您可能不喜欢这样:
$ for a in `seq 5`; do echo -n %; done
%%%%%
echo $(yes % | head -n3)
for ((i=0; i<3; i++)){
echo -ne "%"
}
s=$( printf "%3s" ); echo " ${s// /%}"
资料来源:
也有这种形式,但不是很有用:
echo %{,,}
当然,只需使用
printf
和一些bash字符串操作
$ s=$(printf "%-30s" "*")
$ echo "${s// /*}"
******************************
应该有一个较短的方法,但目前我会这样做。您可以将其制作成一个函数,存储在库中供将来使用
printf_new() {
str=$1
num=$2
v=$(printf "%-${num}s" "$str")
echo "${v// /*}"
}
试运行:
$ printf_new "*" 20
********************
$ printf_new "*" 10
**********
$ printf_new "%" 10
%%%%%%%%%%
另一个:
char='%'
count=5
result=$( printf "%${count}s" ' ' )
echo -e ${result// /$char}
/dev/zero
获取任意数量的零(\0
)字符。唯一要做的就是
head -c 20 /dev/zero |tr '\0' '+'
请注意,head
和tr
是外部命令。以便在单独的过程中调用它CACHE="$(head -c 1000 /dev/zero |tr '\0' '+')"
echo "${CACHE:0:10}"
echo "${CACHE:0:100}"
echo "${CACHE:0:300}"
echo语句中只有bash
内置。所以,我们可以循环使用它实际上有一个单行程序可以做到这一点:
printf "%0.s-" {1..10}
印刷品
----------
下面是传递给printf
的参数的分解:
- %s-指定任意长度的字符串
- %0s-这指定一个长度为零的字符串,但如果参数更长,它将打印整个字符串
- %0.s-这与上面的相同,但是如果字符串长度超过指定的长度(即零),句点会告诉
截断字符串printf
- {1..10}-这是一个大括号扩展,它实际传递参数“12345678910”
- “-”-这是为
提供的一个额外字符,它可以是任何字符(对于“%”,必须先用另一个“%”转义,即“%”)printf
- 最后,
的默认行为是,如果您给它的参数比格式字符串中指定的参数多,则会循环回格式字符串的开头,然后再次运行它printf
printf
,如果提供的字符串长度大于零,您希望它打印一个长度为零的字符串,而不需要额外的字符。然后在这个零长度字符串之后,打印一个“-”(或任何其他字符集)。然后为它提供10个参数,这样它会打印10个零长度字符串,每个字符串后面都有一个“-”
这是一个单行程序,可以打印任意数量的重复字符
编辑:
巧合的是,如果要打印$variable
字符,只需稍微更改参数即可使用seq
而不是大括号展开,如下所示:
printf '%0.s-' $(seq 1 $variable)
这将把参数“1 2 3 4…$variable”传递给
printf
,精确地打印“-”的$variable
实例
seq -s % 4|tr -d '[:digit:]'
请注意,在创建的序列中只有3个“%”。此问题的当前公认答案(by)提供了一种即使是中等数量的字符也执行极慢的方法。得票最多的答案更好,但仍然很慢 以下是在我的测试中执行得最快的(甚至比python版本还要快): 排在第二位的是python命令:
python -c "print('*' * 1000)"
如果perl和python都不可用,那么这是第三种最好的方法:
head -c 1000 /dev/zero | tr '\0' '*'
第四位是使用bashprintf
内置以及tr
:
printf '%*s' 1000 | tr ' ' '*'
这里有一个(来自的答案)对于大量重复字符的速度排在第五位,但对于少量字符的速度可能更快(因为只使用bash内置程序,而不生成外部进程):
#/usr/bin/awk-f
开始{
而(c++<3)printf“%”
}
结果
%%%
%%%
+1对于
yes
和head
的组合,这就是人们现在使用的!我开始寻找/dev/y
,但在我的现代系统上找不到它。你8年前发布的链接已过时,请编辑它或将其全部删除,因为它会重定向到一个外观可疑的网站……如果你使用printf-v
,你可以避免在此处使用子shell<代码>printf-v str“%-30s”;回显“${str//*}”-1。这非常慢,尤其是对于>1000个字符。几乎任何东西都更快,包括printf“%.s*”{1..30}
,或printf“%*s”1000000'|tr'*'
,对于较大的数字。printf_new在第三次测试运行时失败。我会这样修复它:printf-v“%-*s”“$num”“;echo“${v//$str}”
在bash中实现这些琐碎的事情让我哭了。很好,但这在#中不起作用/bin/sh,但仅限于#/bin/bash由于它使用内置的bash,对于少量重复字符,它应该比生成外部进程的方法快。对于较大的数字,printf“%*s”1000000“|tr”-”
和其他方法更快。遇到这个问题-以及许多其他类似问题-因为我需要创建一个包含1000000个单词的单词列表,以便在密码破解程序中进行性能测试。作为记录,我使用了“slow”printf“%0.s-”{1..1000000}
的一个线性解决方案大约需要5秒钟。@jww{1..10}
打印10次作为一个例子,3次将是{1..3}
,如果您想打印$n
次数,其中$n=3
您可以执行printf 0.s-$(seq 1$n)
当您可以简单地编写:用于{1..5}中的一个程序时,为什么要使用另一个程序;do-echo-n%;完成
)我发现自己在一个脚本中,我的“解决方案”不起作用,这里有一个解决方案。比printf“%0.s%%”{1..5}
慢,反过来又比printf“%*s“5”| tr“%”慢。
@Deadcode-1通常用于错误答案,而不是低效答案。可能还有其他的方法来实现c