read name 和 read 在 Bash 中的區別

read 帶一個參數和不帶參數的區別是什麼,我本覺得僅僅是被賦值的變量的名字不一樣而已:bash

$ read nameless

1spa

$ echo "$name"ip

1字符串

$ read源碼

1string

$ echo "$REPLY"it

1io

當沒有指定變量名時,read 會給默認的變量 REPLY 賦值,僅此而已。然而今天我卻發現個細微的區別(下面爲了顯示空格故意加了背景色):table

$ read name

    1    

$ echo "$name"

1

$ read

    1    

$ echo "$REPLY"

    1    

看到了吧,當你使用自定義的變量名時,用戶輸入的字符串中開頭和尾部的 IFS 空白符都會被 strip 掉,而使用默認的 REPLY 變量時,就不會有這個操做。我翻了下 Bash 源碼,找到了一段專門爲這個行爲寫的註釋:

/* If there are no variables, save the text of the line read to the
variable $REPLY. ksh93 strips leading and trailing IFS whitespace,
so that `read x ; echo "$x"' and `read ; echo "$REPLY"' behave the
same way, but I believe that the difference in behaviors is useful
enough to not do it. Without the bash behavior, there is no way
to read a line completely without interpretation or modification
unless you mess with $IFS (e.g., setting it to the empty string).
If you disagree, change the occurrences of `#if 0' to `#if 1' below. */

也就是說,Bash 做者覺的,應該留一個方便的,不用改 IFS 就能讓 Shell 能獲取到用戶完整的輸入的字符串的小技巧。裏面也說了,ksh 沒有這個特殊處理,這是 Bash 本身發明的小把戲。

相關文章
相關標籤/搜索