Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中重复打印字符_Bash_Shell - Fatal编程技术网

在bash中重复打印字符

在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是一个外部程序

是否有一种方法可以在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
是一个外部程序(您可能有)。

我喜欢这样:

$ 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' '*'
    
    第四位是使用bash
    printf
    内置以及
    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