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

Unix 在shell脚本中创建重复字符字符串,unix,shell,Unix,Shell,我需要生成一串点(字符)作为变量 也就是说,在我的Bash脚本中,对于输入15,我需要生成这个长度为15的字符串:……… 我需要可变地这样做。我试着用它作为基础(): 但是如何将100作为一个变量呢?在大多数系统中,您可以通过简单的 N=100 myvar=`perl -e "print '.' x $N;"` 无回路的解决方案: N=100 myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'` 当我必须创建一个字符串,其中包含已知字符的$x重复,且$x

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

也就是说,在我的Bash脚本中,对于输入
15
,我需要生成这个长度为15的字符串:
………

我需要可变地这样做。我试着用它作为基础():


但是如何将100作为一个变量呢?

在大多数系统中,您可以通过简单的

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

无回路的解决方案:

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

当我必须创建一个字符串,其中包含已知字符的
$x
重复,且
$x
低于常量值时,我使用以下习惯用法:

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

您可以在Bash中为循环使用C-style

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

您可以从/dev/zero获得所需的任意多个空字节。然后可以将这些字符转换为其他字符。以下打印16个小写a

head -c 16 < /dev/zero | tr '\0' '\141'
head-c16
没有环路的最简单最短路径

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

将虚线保存在变量中以供以后使用:

line=`printf '.%.0s' {1..$VAR}`
echo "Sign here $line"
-明目张胆地从罗布麻的答案中窃取

编辑:由于我现在切换到了fishshell,这里有一个在config.fish中定义的函数,它可以方便地在该shell中执行此操作:

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

用法:
line=8
产生
=======
line\“8
产生

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

我在末尾添加了一个关于生成可变数量的重复字符的附录,这正是您所要求的,因此我之前的回答与此相关:

我对它的工作原理进行了完整的解释。在这里,我将添加代码以实现您的要求:

    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
产出:

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

这是到目前为止我见过的最短的解决方案。可以更短一些,去掉“$len”中的引号$len;)+1表示一个甜美的、可移植的解决方案,没有肮脏的bashism或数百个正在生成的进程。您可以直接使用/dev/zero,无需重定向。没有那么甜美和可移植性:“head:非法选项--c”(SunOS 5.10通用_150401-20 i86pc i386 i86pc)
head-c
仅在GNU和BSD UTIL上可移植,它不是POSIX。如果
dd=/dev/zero-bs=1 count=16
replacind
head
部分,您可以使用
dd
代替
dd=/dev/zero-bs=1 count=16
replacind。这是一种利用printf的shell特性的有趣的方法,它可以重复地使用参数,直到与零字段宽度相结合仅打印%之前的字符串。这也可以用作除以计数的技巧(将%.0s添加两次以强制其每次使用2个参数)哦,是的,我忘记了一件重要的事情,因为printf处理%s时如果没有给定参数,那么值为零将是一个问题,因为您必须添加if语句如果我使用eval:
VAR=15;eval printf'=.0s'{1..$VAR},这只对我的shell(bash)有效
也只对我使用eval有效。用$COLUMNS替换$VAR对于制作水平标尺非常有用。如果需要从脚本内部执行:
hr(){eval printf'=%.0s'{1..$(tput cols)};echo;}
@6eqj5在
bash
中,不能在大括号扩展中使用变量。相反,可以使用
$(seq 1$VAR)
代替bash和ksh(可能是zsh)中的
{1..$VAR}
,您可以编写
echo${base:0:$x}
——有关:重复的详细信息:至少在
zsh中,
{1..$length}
工作正常。n=0无法生成正确的字符数。大多数printf解决方案也是如此。
VAR=15
printf '.%.0s' {1..$VAR}
line=`printf '.%.0s' {1..$VAR}`
echo "Sign here $line"
function line -a char -a length
  printf '%*s\n' $length "" | tr ' ' $char
end
    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
....................