如何在Bash中创建带有shell输出(反引号)的字符串?

时间:2011-06-06 11:34:09

标签: string bash

我一直在尝试为基准程序创建一个字符数可变的字符串。我正在尝试使用它来设置我的消息字符串:

messages=`perl -e 'print "X" x $size'`

目标是创建动态数量的字符。例如,如果$ size为1,那么将有一个X.如果size为5,则消息将为XXXXX。这似乎不起作用,输出是空白的。

我误解了什么吗?

4 个答案:

答案 0 :(得分:2)

bash未评估$size的原因是您将其括在单引号(')中。如果您使用$(...)语法而不是反引号,则会更加明显:

messages=$( perl -e 'print "X" x $size' )

原则是单引号内的所有内容都没有被bash触及(只有引号在单词拆分后才会被删除),而双引号中的内容会得到各种shell扩展(不含引号)。

因此Perl在这里获得$size并且只能尝试将其评估为perl变量。

正如其他迭戈所说,交换引号可以提供帮助:

messages=$( perl -e "print 'X' x $size" )

答案 1 :(得分:1)

尝试:

messages=`perl -e 'print "X" x shift' $size`

您需要在bash中评估$size,而不是在perl中。这样您就可以将它作为命令行参数传递给脚本,并在Perl中使用单个shift获取。

答案 2 :(得分:0)

另一种可能的解决方案:

messages=`perl -e "print \"X\" x $size"`

甚至,玩引号:

messages=`perl -e "print 'X' x $size"`

答案 3 :(得分:0)

嗯,恕我直言呼叫perlawk进行简单的字符串处理是hackish。像这样的简单任务可以直接完成:

in='X' out='' x=5
for ((i = 0; i < x; ++i)); do out+="$in"; done