有没有办法在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 '%*s' 1000000 ''|tr ' ' '-'
和其他方法会更快。 - Deadcode{1..10}
打印了 10 次,如果要打印 3 次,则为 {1..3}
,如果您想要打印 $n
次,其中 $n = 3
,则可以执行 printf '%0.s-' $(seq 1 $n)
。 - CaffeineConnoisseur0
是一个宽度说明符,用于指定最小长度。然后您提供了一个空的精度说明符 .
(而不是 .#
),它指定了最大宽度为 0。因此,您可以写成 printf '%.s-'
,因为宽度说明符是多余的。 - Qualia当然可以,只需使用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
%%%%%%%%%%
printf -v
,您可以避免在此处使用子shell。 printf -v str'%-30s'' '; echo "${str // /*}"
- kojiroprintf '%.s*' {1..30}
或者对于大数字使用 printf '%*s' 1000000 ''|tr ' ' '*'
。 - Deadcodeprintf -v v "%-*s" "$num" ""; echo "${v// /$str}"
- jarno这个问题目前被接受的答案(由 ghostdog74提供)的方法,在字符数较高的情况下执行速度极慢。得票最高的答案(由 CaffeineConnoisseur)更好一些,但仍然相当缓慢。
在我的测试中,以下方法是执行速度最快的(甚至比Python版本还要快):
perl -E "print '*' x 1000"
第二名是Python命令:
python -c "print('*' * 1000)"
如果没有perl或python可用,那么这是第三好的选择:head -c 1000 /dev/zero | tr '\0' '*'
第四名是使用 bash 中的 printf
内置命令及 tr
命令:
printf '%*s' 1000 | tr ' ' '*'
这里有一个来自CaffeineConnoisseur的答案,在处理大量重复字符时排名第五,但在处理少量字符时可能更快(因为它仅使用内置的bash命令,而不会产生外部进程):
printf '%.s*' {1..1000}
*
是要输出的字符,在最后一个例子中,前面的 %.s
的目的是什么? - Hashim Azizstr=\
perl -E "print '*' x 1000"`` - PeterK我很喜欢这个:
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 %{,,}
/dev/y
,但在我的现代系统上找不到它。 - Jeremy J Starcher虽然不太美观,但你可以这样做:
$ for a in `seq 5`; do echo -n %; done
%%%%%
seq
是一个外部程序(你很可能已经拥有了)。for a in {1..5}; do echo -n %; done
。 - Daniele Vrutprintf "%0.s%%" {1..5}
慢,而后者比 printf '%*s' 5 ''|tr ' ' '%'
还要慢。 - DeadcodeIt is possible to obtain any number of zero (\0
) character from /dev/zero
. The only thing left to do it is
head -c 20 /dev/zero |tr '\0' '+'
Note that head
and tr
are external commands. So that it would be invoked in separate process.
It is possible to "optimize" this solution with string caching.
CACHE="$(head -c 1000 /dev/zero |tr '\0' '+')"
echo "${CACHE:0:10}"
echo "${CACHE:0:100}"
echo "${CACHE:0:300}"
There are only bash
built-ins in the echo statement. So, we can use it in cycle.
另一个:
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个“%”符号。
printf '%*s' 3 ''|tr ' ' '%'
慢。 - Deadcode
printf %9s|tr ' ' '\n'
- user5490177