这个问题已经在这里有一个答案:
- 我怎么能重复Bash的一个人物? 24个回答
有没有办法在bash反复打印相同的字符,就像你可以使用此结构来做到这一点在Python:
print('%' * 3)
给
%%%
这个问题已经在这里有一个答案:
有没有办法在bash反复打印相同的字符,就像你可以使用此结构来做到这一点在Python:
print('%' * 3)
给
%%%
肯定的是,只要使用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 "%0.s-" {1..10}
版画
----------
下面是传递给参数击穿printf
:
printf
截断字串,如果它是于指定的长度,这是零长 printf
,它可以是任何东西(一个“%”你必须与另一个“%”转义第一,即“%%”) printf
如果你给它的参数比存在格式字符串指定是循环回格式字符串的开头并再次运行它。 什么是怎么回事,然后的最终结果是,你告诉printf
,你想让它打印零长度字符串,没有额外的字符,如果提供的字符串是大于零更长。 然后在此之后零长度的字符串打印一个“ - ”(或任何其它的字符集)。 然后你提供这10个参数,所以它打印以下每10零长度字符串“ - ”。
这是一个一行,打印任意数量的重复字符的!
编辑:
巧合的是,如果你想打印$variable
字符,你只需要稍微改变参数使用seq
而不是括号展开如下:
printf '%0.s-' $(seq 1 $variable)
这反而会传递参数“1 2 3 4 ... $变量”来printf
,打印精确$variable
的情况下,“ - ”
对于这个问题(由目前接受的答案ghostdog74 )规定,执行极其缓慢甚至适度大量的字符的方法。 得票最多的答案(由CaffeineConnoisseur )是更好的,但仍是相当缓慢。
这里是什么,在我的测试中,已经执行了所有最快的(甚至快于Python版本):
perl -E "print '*' x 1000"
位居第二的是python命令:
python -c "print('*' * 1000)"
如果没有perl的也不蟒蛇是可用的,那么这是第三好的:
head -c 1000 /dev/zero | tr '\0' '*'
而在第四位的是使用的是bash的一个printf
内置连同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
是一个外部程序(你可能有)。
另一个:
char='%'
count=5
result=$( printf "%${count}s" ' ' )
echo -e ${result// /$char}
这是能够得到的任何数目的零( \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}"
只有bash
回声声明内置插件。 因此,我们可以循环使用。
这是最简单的方式来做到这一点
seq -s % 4|tr -d '[:digit:]'
注意会出现在创建序列只有3“%”。
#!/usr/bin/awk -f
BEGIN {
while (c++ < 3) printf "%"
}
结果
%%%