2014-11-06 66 views
0

我在bash中寫了一個小腳本,但它只在將字符串作爲變量存儲時才起作用,並且我想知道原因。以下是摘要:bash之間的原始字符串和字符串之間的差異

當我使用字符串本身,慶典將其視爲一個單一實體

for word in "this is a sentence"; do 
    echo $word 
done 
# => this is a sentence 

如果我救了完全相同的字符串轉換成變量,bash中遍歷的話

sentence="this is a sentence" 
for word in $sentence; do 
    echo $word 
done 

# => this 
# is 
# a 
# sentence 
  1. 爲什麼這些被區別對待?
  2. 有沒有一種簡單的方法來遍歷字符串中的單詞,而無需首先將字符串保存爲變量?
+1

1.請了解報價。 – 2014-11-06 21:34:46

+2

2.然後嘗試:'在這是一句話;做回聲「$ word」; done'。 – 2014-11-06 21:35:41

+0

'bash -x' ...... – 2014-11-06 21:37:30

回答

2

在分配

sentence="this is a sentence" 

有沒有不帶引號的空間,所以一切都在=的權利被視爲一個字。 (像sentence=this is a sentence這樣的東西將被解析爲單個任務sentence=this,然後嘗試運行名爲is的程序。)結果,sentences的值是一個由18個字符組成的序列。它與

sentence=this\ is\ a\ sentence 

因爲再一次沒有未加引號的空格。

出於同樣的原因

for word in "this is a sentence"; do 
    echo $word 
done 

具有word設定爲在以下序列,其僅包含一個字,因爲沒有無引號空格每個單詞。

與您的其他循環的關鍵區別在於參數展開後事實上分詞。環路

for word in $sentence; do 
    echo $word 
done 

參數後膨脹的樣子

for word in this is a sentence; do 
    echo $word 
done 

所以現在word被設置爲每一個在列表中詞語之後的in關鍵字。

目前還不清楚在問題結尾你實際詢問了什麼,但前面的內容是合法代碼。不要求在bash中將字符串放在引號中;引號不會將某些字符串定義爲字符串值,而只是將每個出現在引號內的字符都轉義出來。 "foo"\f\o\o在shell中是一樣的。

0

引用將任何字符串轉換爲一個單元。如果你失去了報價,一切都應該沒問題。

2

引號告訴bash將引號中的東西當作參數列表中的單個參數,在表達式評估時爲。引號(除非用\或'保護)被刪除。

echo "" # prints newlines, no quotes 
echo '""' # Print "" 

export X='""' 
env | grep X # X contains "" 

export X="" 
env | grep X # X is empty 

當你使用一個變量,慶典拆包爲是(即,如果你輸入的變量的內容在變量的地方)。對於for-loop bash,通過用空格分隔for循環的參數來確定要迭代的list-elements,但是將一個參數/列表元素作爲引用受保護的項目。您的變量不包含引號 - 項目被視爲單獨的參數。

3

正如評論建議,引號是重要的。 for循環將遍歷以分號結尾的值列表,並且該列表是一組字符串。未加引號的字符串通常用空白分隔。帶引號的字符串中的空格不會將字符串與其弟弟分開,它只是引用字符串的一部分。有一些關於bash的報價的真正優秀的文檔,在http://mywiki.wooledge.org/Quotes。閱讀。現在閱讀。你會發現一個部分說

引號實際上並沒有傳遞給命令。它們被shell刪除(這個過程巧妙地稱爲「quote removal」)。

若要單步執行一個儲存在一個變量(如果我正確地推斷出你的問題)在一個句子的話,你也許可以使用數組由空格的話分開:

#!/bin/bash 

sentence="this is a sentence" 
IFS=" " read -a words <<< "$sentence" 
for word in "${words[@]}"; do 
    echo "$word" 
done 

在bash中,read -a會將字符串除以$IFS並將分割的部分放入數組的元素中。有關bash數組如何工作的更多信息,請參閱http://mywiki.wooledge.org/BashGuide/Arrays

如果您想要了解更多具體問題的詳細信息,您可能想告訴我們問題是什麼,或者冒險將其作爲XY problem

+0

那麼我的「問題」不理解爲什麼語法按照我的預期運行,而另一個與我相當的語言無法工作。像你這樣的答案是我一直在尋找的。 – EthanP 2014-11-06 21:55:43

+0

建議:'read -r'。 – 2014-11-06 21:58:38

相關問題