在shell脚本中创建重复字符串

时间:2010-07-09 10:50:26

标签: unix shell

我需要生成一串点(.个字符)作为变量。

即,在我的Bash脚本中,输入15我需要生成长度为15的字符串:...............

我需要这样做。我尝试使用它作为基础(from Unix.com):

for i in {1..100};do printf "%s" "#";done;printf "\n"

但是如何让100成为变量?

9 个答案:

答案 0 :(得分:61)

您可以从/ dev / zero获得所需数量的NULL字节。然后,您可以将这些转换为其他字符。以下打印16小写a的

head -c 16 < /dev/zero | tr '\0' '\141'

答案 1 :(得分:31)

len=100 ch='#'
printf '%*s' "$len" | tr ' ' "$ch"

答案 2 :(得分:14)

没有循环的最简单和最短的方式

VAR=15

打印与VAR所说的一样多的点(如果您愿意,可将第一个点更改为任何其他字符):

printf '.%.0s' {1..$VAR}

将虚线保存在稍后要使用的变量中:

line=`printf '.%.0s' {1..$VAR}`
echo "Sign here $line"

- 从dogbane的回答https://stackoverflow.com/a/5349842/3319298

中明显被盗

编辑:由于我现在已切换到 fish shell,因此这是一个在config.fish中定义的函数,可以在shell中方便地执行此操作:

function line -a char -a length
  printf '%*s\n' $length "" | tr ' ' $char
end

用法:line = 8生成========line \" 8生成""""""""

答案 3 :(得分:6)

在大多数系统上,您可以使用简单的

N=100
myvar=`perl -e "print '.' x $N;"`

答案 4 :(得分:4)

您可以在Bash中使用C风格的for循环:

num=100
string=$(for ((i=1; i<=$num; i++));do printf "%s" "#";done;printf "\n")

或没有循环,使用printf而不使用sedtr之类的任何外部:

num=100
printf -v string "%*s" $num ' ' '' $'\n'
string=${string// /#}

答案 5 :(得分:4)

我演示了一种在另一个问题中使用单个命令完成此任务的方法,假设它要生成固定数量的字符。

我在最后添加了一个关于产生可变数量的重复字符的附录,这就是你要求的,所以我之前的答案是相关的:

https://stackoverflow.com/a/17030976/2284005

我提供了有关它如何在那里工作的完整解释。在这里,我只是添加代码来完成您要求的内容:

    n=20 # This the number of characters you want to produce

    variable=$(printf "%0.s." $(seq 1 $n)) # Fill $variable with $n periods

    echo $variable # Output content of $variable to terminal

输出:

....................

答案 6 :(得分:2)

没有循环的解决方案:

N=100
myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'`

答案 7 :(得分:2)

num=100
myvar=$(jot -b . -s '' $num)
echo $myvar

答案 8 :(得分:-1)

当我必须创建一个字符串,其中包含$x重复的已知字符且$x低于常量值时,我会使用此成语:

base='....................'
# 0 <= $x <= ${#base}
x=5
expr "x$base" : "x\(.\{$x\}\)"    # Will output '\n' too

输出:

.....