我需要生成一串点(.
个字符)作为变量。
即,在我的Bash脚本中,输入15
我需要生成长度为15的字符串:...............
我需要这样做。我尝试使用它作为基础(from Unix.com):
for i in {1..100};do printf "%s" "#";done;printf "\n"
但是如何让100成为变量?
答案 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
而不使用sed
或tr
之类的任何外部:
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
输出:
.....