2011-06-06 110 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 
相關問題