2017-06-01 49 views
0

我花了一段令人尷尬的漫長時間試圖理解爲什麼下面的「foo」腳本中的第二個條件失敗,但第一個條件成功。簡單的條件在bash中意外失敗,如果語句

請注意:

  • 當前目錄包含兩個文件:酒吧和Foo。
  • 根據hexdump,所有三個字符串$ s1,$ s2和$ s3是相等的。

在此先感謝您的幫助。

會議:(運行Centos7主機上):

>ls 
bar foo 
>cat foo 
#!/bin/bash 

s1="bar foo" 
s2="bar foo" 
s3=`ls` 

echo -n $s1 | hexdump -C 
echo -n $s2 | hexdump -C 
echo -n $s3 | hexdump -C 

if [ "$s1" = "$s2" ]; then # True 
    echo s1 = s2 
fi 

if [ "$s1" = "$s3" ]; then # NOT true! Why? 
    echo s1 = s3 
fi 

>foo 
00000000 62 61 72 20 66 6f 6f        |bar foo| 
00000007 
00000000 62 61 72 20 66 6f 6f        |bar foo| 
00000007 
00000000 62 61 72 20 66 6f 6f        |bar foo| 
00000007 
s1 = s2 
> 
+1

但是,請注意's3 = \'ls \''不是將文件名列表讀入變量的方式。閱讀[爲什麼你不應該解析ls(1)]的輸出(http://mywiki.wooledge.org/ParsingLs),然後再根據你的實驗開始編寫任何實際的代碼。 – chepner

+0

歡迎來到Stack Overflow。 請注意,在這裏說'謝謝'的首選方式是通過 提高投票的好問題和有用的答案(一旦你有足夠的聲譽這樣做),並接受任何 問題最有用的答案,你問(這也給你一個小小的提升,以你的聲望 )。 請參閱[關於]頁面,以及[如何在此處提問 ?]和 [當有人回答我的 問題時,我該怎麼辦? ?](http://stackoverflow.com/help/someone-answers) –

回答

4

引用變量呼應時。

echo -n "$s3" | hexdump -C 

你會看到文件名之間的換行符,作爲ls使用-1當輸出重定向。

2

你的演示將更有說服力與echo -n "$s1"等工作。這就表明,有在s3中間換行,其中有一個空間s1s2。不帶雙引號的echo將換行符換成空格(並且通常將字符串中的一個或多個空格字符的每個序列轉換爲單個空格)。

考慮:

#!/bin/bash 

s1="bar foo" 
s2="bar foo" 
s3=`ls` 

echo -n "$s1" | hexdump -C 
echo -n "$s2" | hexdump -C 
echo -n "$s3" | hexdump -C 

if [ "$s1" = "$s2" ]; then # True 
    echo s1 = s2 
fi 

if [ "$s1" = "$s3" ]; then # NOT true because s3 contains a newline! 
    echo s1 = s3 
fi 

我得到:

$ sh foo 
00000000 2d 6e 20 62 61 72 20 66 6f 6f 0a     |-n bar foo.| 
0000000b 
00000000 2d 6e 20 62 61 72 20 66 6f 6f 0a     |-n bar foo.| 
0000000b 
00000000 2d 6e 20 62 61 72 0a 66 6f 6f 0a     |-n bar.foo.| 
0000000b 
s1 = s2 
$ bash foo 
00000000 62 61 72 20 66 6f 6f        |bar foo| 
00000007 
00000000 62 61 72 20 66 6f 6f        |bar foo| 
00000007 
00000000 62 61 72 0a 66 6f 6f        |bar.foo| 
00000007 
s1 = s2 
$