2013-03-21 155 views
0

哪種形式最有效?Bash變量級聯

1)

v='' 
v+='a' 
v+='b' 
v+='c' 

2)

v2='a'` `'b'` `'c' 

假設可讀性都是一模一樣的給你,這是一個延伸,將1)的意思是創建並扔掉一些字符串immutables(如在Python中)還是充當定期擴展緩衝區容量的Java「StringBuffer」?在Bash內部如何處理字符串連接?

如果2)和1)一樣可讀,那麼反引號是否會產生子殼,並且這會更昂貴,即使它可能比1)中沒有的操作更具成本效益?

回答

2

好,最簡單,最有效的機制將選擇0:

v="abc" 

第一種機制涉及四個任務。

第二種機制是奇怪的(並且絕對不可讀)。它(名義上)在兩個子shell(兩個` `部分)中運行一個空命令,並將輸出(一個空字符串)與三個常量連接起來。如果shell只是執行back-tick命令而不注意它們是空的(並不是不合理的,它不會注意到;這是一個奇怪的事情 - 我不記得在我以前的30年中看到它完成了的shell腳本),這肯定要慢得多。因此,只給出選項(1)和(2),使用選項(1),但通常使用上面顯示的選項(0)。

爲什麼你會像這樣零碎地建立起這根弦?你的例子中缺少的東西使原始代碼變得明智,但縮減的代碼顯得不那麼明智。

v="" 
x=$(...) 
v="$v$x" 
y=$(...) 
v="$v$y" 
z=$(...) 
v="$v$z" 

這會更有意義,特別是在使用各$x$y$z後,和/或使用的$v中間值(可能在由三重圓點表示的命令)。所使用的連接符號將適用於任何Bourne-shell衍生物;替代+= shell將使用更少的shell,但可能稍微更高效(重點在於「略微」)。

+0

解析器不應該注意到反引號內缺少令牌,而是摺疊爲「no-op」,這是非常奇怪的。無論如何,你是對的..零星的變量在其他地方使用..我壓縮了這個例子。 – Robottinosino 2013-03-21 02:03:18

+0

30年的腳本..哇,順便說一句。我尊敬地鞠躬!感謝您的回答!你碰巧知道字符串連接在內部是如何工作的嗎?我想可以看看源代碼。 – Robottinosino 2013-03-21 02:06:17

+0

我從來沒有見過任何人不想在子shell中運行並捕獲輸出。也許是靈感來自Python的知識嗎?我沒有看,但如果shell沒有爲每個變量的值使用可變字符串,我會感到驚訝。像Python一樣不可變的是一個更近的想法。 – 2013-03-21 02:06:35

0

便攜式和直接的方法是使用雙引號和大括號的變量:

VARA="beginning text ${VARB} middle text ${VARC}..." 

,你甚至可以設置默認值空變量使用花這樣

VARA="${VARB:-default text} substring manipulation 1st 3 characters ${VARC:0:3}" 

括號可防止出現$VARa而您想寫${VAR}a但最終得到${VARa}的內容

+1

您的意見是準確的,但並不真正解決問題。 – 2013-03-21 02:12:27

+0

@JonathanLeffler - 是的,你已經解決了這個問題,我正在解決效率的另一面 - 編寫它,以便在添加新變量時不會中斷......而雙引號比效率更高(可讀) ''單引號周圍的文字和粉碎'$ VARS'像這樣'' – technosaurus 2013-03-21 02:18:03

+0

行;也許你應該解釋你在說什麼。我希望看到雙引號比單引號「效率更高」的證據。對於shell來說,單引號實際上更容易處理,但差異可以忽略不計,因此對於大多數實際用途而言,它們將是相同的。我同意雙引號是'更具可讀性'(並且在編程人員使用時更加高效),尤其是如果您需要將變量插入到字符串中。 – 2013-03-21 02:26:30