2017-08-24 27 views
1

當我在Mac OS運行在我的終端,這些行我得到正確的結果慶典VS sh腳本不同的結果

hex=$(echo -n 'betty' | xxd -p) 
echo $hex 

6265747479 

,但是當我在bash腳本運行它們,我得到完全不同的東西

sh myscript.sh 

62657474790a 

這就像它由於某種原因將回車放在最後。爲什麼?

+0

無法重現。請添加'cat myscript.sh的輸出; sh myscript.sh' – Leon

+0

@Peter:首先,它不是*回車*,它是*換行*。其次,似乎涉及不同的炮彈。在你的第二個例子中,你提供'sh'作爲shell,並且我們不知道sh在你的機器上連接到哪裏。如果兩者都是bash shell,它們可能是不同的版本(在兩種版本中都做一個'print $ BASH_VERSION'),它們以不同的方式實現'echo'。 – user1934428

+0

我很驚訝'echo -n'betty''會產生輸出,這個輸出看起來是'betty'後跟一個換行符。我希望不帶換行符的'betty',或換行符的'-n betty'。與'echo -n betty'相比,'sh -c'echo -n betty'' print究竟是什麼? 'ls -l/bin/sh'說什麼? –

回答

2

不同版本的echo做不同的事情給出-n作爲他們的第一個參數的時候。有些人將其作爲他們輸出的一部分進行打印,有些人將其解讀爲旗幟,誰知道會發生什麼。根據POSIX standard for echo,「如果第一個操作數是-n,或者任何操作數包含反斜槓字符,則結果是實現定義的。」

printf之後打印沒有換行的字符串的最可靠的方法。它稍微複雜一點,因爲您必須給它一個格式字符串以及要打印的字符串:

hex=$(printf "%s" 'betty' | xxd -p) 
+0

我明白了,即使它們是相同的命令,運行時(sic)也可以用不同的方式處理它們。 – Peter

1

嘗試bash而不是sh。由於echo內置的命令,它依賴於shell如何執行。對我來說,從SH回聲似乎並不支持-n

sh-3.2$ echo -n hello 
-n hello 
sh-3.2$ echo $(echo -n 'betty' | xxd -p) 
2d6e2062657474790a