2011-06-06 57 views
0

我一直在尝试为基准程序创建一个字符串数量可变的字符。我想用这个来建立我的消息字符串:如何在Bash中使用shell输出(反引号)创建一个字符串?

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

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

我误会了什么吗?

+4

我以为你知道谷歌的一切。 – Bastardo 2011-06-06 11:36:11

+0

你的问题是与Perl代码,而不是反引号。 – 2011-06-06 11:37:11

+0

我希望!我刚刚意识到这个问题与$ size有关,但我似乎无法逃脱它,所以脚本意识到它是一个bash变量,并不意味着在反引号中。 – 2011-06-06 11:37:22

回答

3

$size不被bash的评估的原因是你在单引号它(') 。如果使用$(...)语法,而不是反引号这变得更加明显:

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

的原则是,单引号内的一切不被bash的触摸(仅报价是分词后,终于剥离),而在事双引号可以获得各种shell扩展(甚至没有引号)。

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

正如已经被其他迭戈说,交换左右报价的迹象可以帮助:

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

谢谢,我学到了很多东西。 :) – 2011-06-06 11:57:44

2

尝试:

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

你需要在bash评估$size,而不是在Perl。通过这种方式,您可以将它作为脚本的命令行参数传递给Perl,并使用单个shift获取Perl。

+0

谢谢你的工作,以及另一张贴。 – 2011-06-06 11:43:24

+0

很好的解决方案,以避免shell引用地狱 – 2011-06-06 14:10:48

1

另一种可能的解决方案:

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

,甚至与报价打:

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

谢谢这个人也工作。 – 2011-06-06 11:43:35

+0

Perl的引用运算符在这里很方便(对于更复杂的脚本):'msg = $(perl -e“print q(X)x $ size”) – 2011-06-06 14:10:16

0

嘛,恕我直言调用perlawk为简单的字符串处理hackish。像这样一个简单的任务可以直接完成:

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