2016-01-23 51 views
1
bktitle="Bash" 
echo "New book title '$bktitle' added successfully!" 

我以爲單引號使所有的字面意思?但是,這是給的理解bash邏輯。 (運營商和報價)

New Book title Bash added successfully! 
egrep ^[0-9]+$ 

爲什麼會這樣行只接受整數輸出?我知道^是用於開始的,+表示前面必須至少出現一次。但據我所知$,我不確定。它會不會接受像1a這樣的東西?

egrep ^[0-9]+[.][0-9][0-9] 

爲什麼這行只能接受小數點後兩位小數?我認爲+只會允許它確保起始號碼必須是0-9。那爲什麼它不接受像1a.00這樣的東西?

+0

它與bash無關.. –

+0

這不是bash語言嗎? –

回答

0

我以爲單引號使一切都按字面?但這是給出New Book title 'BASH' added successfully的輸出。

在您的例子:

bktitle="BASH" 
echo "New book title '$bktitle' added successfully!" 

內使用雙引號字符串(""),單引號('')不解釋,但變量。

如果你這樣做:

bktitle="BASH" 
echo 'New book title \'$bktitle\' added successfully!' 

或者這樣:

bktitle="BASH" 
echo "New book title \'$bktitle\' added successfully!" 

或者這樣:

bktitle="BASH" 
echo 'New book title $bktitle added successfully!' 

你會看到(在頭兩個例子):

New book title '$bktitle' added successfully!

或者:

New book title $bktitle added successfully!

單引號不解釋變量或雙引號(或\escape sequences)。

爲什麼這行只接受整數?我知道這^是開始,+是爲了意味着前面必須至少發生一次..但我的知識$我不知道。但它會不會接受像1a

你說得對^+[0-9]匹配0到9之間的任何數字。$表示結尾 - 與,並表示字符串的結尾。

^[0-9]+$ 

匹配任何包含一個或多個數字的字符串,從頭到尾,沒有別的。

現在你的最後一個問題:

egrep '^[0-9]+[.][0-9][0-9]' 爲什麼會這樣行只接受小數整整2位小數?我認爲+只會允許它確保起始數字必須是0-9。那爲什麼不接受像1a.00這樣的東西?

是的,這將會匹配包含正好兩位小數的十進制數。

如果你想讓它接受字母爲好,只要它以數字開頭,你需要:

egrep '^[0-9][0-9a-z]+[.][0-9][0-9]' 

[0-9a-z]任意數量的0-9,以及任何字母A-Z匹配。

+0

如果單引號沒有用雙引號解釋, bktitle =「BASH」 echo「新書標題$ bktitle添加成功!」 所以當你說$匹配字符串的結尾?它是否意味着字符串的最後一個字符?或者當你像這樣使用它時,「^ [0-9] + $」意味着從0-9開始,並且必須至少出現一次並以它結束? –

1
  1. "New book title '$bktitle' added successfully!"是一個雙引號字符串,恰好包含一些單引號。如果您想查看字面文本'$bktitle',可以使用:"New book title '"'$bktitle'"' added successfully!",它是3個字符串(兩個雙引號(其中一個以單引號結尾,其中一個以單引號開頭)和一個單引號)連接在一起。

  2. $匹配行結束。

  3. 1a.00不匹配,因爲它是行後面跟着數字的三位數,並以文字.「的形式,開始不但是,這將匹配^[0-9]+[a][.][0-9][0-9],例如。

+0

感謝您的解釋。 1.但我認爲單引號會顯示字面文字?正如我所發佈的所有代碼所做的正是我想要的,但我不明白其背後的邏輯。 2.所以既然$匹配行,「1a1」會成功? 3.但是這並不意味着前面的0-9應該至少出現一次,後面跟着一個。和兩位小數位數字。那麼爲什麼1a.00不匹配? –

+0

單引號將顯示文字文本。但是,如果您將單引號放在雙引號字符串中,那麼您仍然有雙引號字符串,並且插值了變量。否「1a1」包含[0-9]以外的字符,因此不匹配。 –