有没有办法在 bash 中重复打印相同的字符,就像你可以在 python 中使用这个结构一样:
print('%' * 3)
给
%%%
实际上有一个单线可以做到这一点:
printf "%0.s-" {1..10}
印刷
----------
以下是传递给的参数的细分printf
:
printf
如果字符串长于指定长度(为零),则该句点告诉截断字符串printf
,可以是任何字符(对于“%”,您必须先用另一个“%”转义它,即“%%”)printf
是循环回到格式字符串的开头并再次运行它。那么这里发生的事情的最终结果是,printf
如果提供的字符串长于零,则您希望它打印一个零长度的字符串,而没有多余的字符。然后在这个零长度字符串之后打印一个“-”(或任何其他字符集)。然后为它提供 10 个参数,因此它会打印 10 个零长度字符串,每个字符串后面都有一个“-”。
它是一种可以打印任意数量的重复字符的单行线!
编辑:
巧合的是,如果要打印$variable
字符,只需稍微更改参数即可使用,seq
而不是大括号扩展,如下所示:
printf '%0.s-' $(seq 1 $variable)
这会将参数“1 2 3 4 ... $variable”传递给printf
,精确打印$variable
“-”的实例
当然,只需使用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
%%%%%%%%%%
这个问题的当前接受的答案(由ghostdog74提供)提供了一种即使对于中等数量的字符也执行得非常慢的方法。投票最多的答案(由CaffeineConnoisseur提供)更好,但仍然很慢。
在我的测试中,这是执行速度最快的(甚至比 python 版本更快):
perl -E "print '*' x 1000"
排在第二位的是 python 命令:
python -c "print('*' * 1000)"
如果 perl 和 python 都不可用,那么这是第三好的:
head -c 1000 /dev/zero | tr '\0' '*'
排在第四位的是使用 bashprintf
内置以及tr
:
printf '%*s' 1000 | tr ' ' '*'
这是一个(来自CaffeineConnoisseur的回答)对于大量重复字符的速度排名第五,但对于少量重复字符可能更快(由于仅使用内置的 bash,而不是产生外部进程):
printf '%.s*' {1..1000}
我喜欢这个:
echo $(yes % | head -n3)
你可能不喜欢这样:
for ((i=0; i<3; i++)){
echo -ne "%"
}
你可能会喜欢这样:
s=$( printf "%3s" ); echo " ${s// /%}"
来源:http ://dbaspot.com/shell/357767-bash-fast-way-repeat-string.html
也有这种形式,但不是很有用:
echo %{,,}
这很难看,但你可以这样做:
$ for a in `seq 5`; do echo -n %; done
%%%%%
当然,seq
是一个外部程序(你可能有)。
可以从 中获取任意数量的零 ( \0
) 字符/dev/zero
。剩下要做的就是
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
内置函数。所以,我们可以循环使用它。
另一个:
char='%'
count=5
result=$( printf "%${count}s" ' ' )
echo -e ${result// /$char}
#!/usr/bin/awk -f
BEGIN {
while (c++ < 3) printf "%"
}
结果
%%%
这是最简单的方法
seq -s % 4|tr -d '[:digit:]'
请注意,创建的序列中只有 3 '%'。