3 回答

TA貢獻1856條經驗 獲得超17個贊
這是Bash 4.2中的錯誤。請參閱chepner的答案以獲取適當的解釋。
這是關于報價。采用:
IFS=':' read var1 var2 <<< "$var"
^ ^
代替
IFS=':' read var1 var2 <<< $var
查看結果:
$ IFS=':' read var1 var2 <<< "$var"
$ echo "var1=$var1, var2=$var2"
var1=hello, var2=world
但
$ IFS=':' read var1 var2 <<< $var
$ echo "var1=$var1, var2=$var2"
var1=hello world, var2=

TA貢獻1898條經驗 獲得超8個贊
供未來讀者參考:
與開發人員討論此問題后,看來這確實是bash4.2中的錯誤,并已在即將發布的4.3版本中修復。從devel分支更改日志
rrrr。修復了IFS出現在臨時環境中并用于重定向時的幾個問題。
雖然無論如何都用引號引起來總是一個好主意,但是OP的代碼應該按預期的方式工作而不用引號。
這是該錯誤的解釋。用代碼
var="hello:world"
IFS=':' read var1 var2 <<< $var
未加引號的$var 應該是一個單詞,因為它的全局值中不包含任何字符IFS(即,不包含空格)。read然后應該看到字符串hello:world。由于它收到了兩個參數,因此應該使用其局部值IFS,產生hello和world分別分配給var1和的單詞拆分var2。
錯誤是,此處的字符串似乎使用IFS傳遞給的“泄漏”值進行了部分拆分read。結果,該字符串變為hello world,但仍被視為read一個單詞。由于該單詞不包含:,因此read請勿將其拆分為兩個單詞,并且將整個字符串分配給var1。
bash如所記錄的,在4.3中,的擴展$var不進行單詞拆分作為<<<運算符的參數。編碼
var="hello:1:2 world"
IFS=: read var1 var2 <<< $var
設置var1到hello和var2到1:2 world。

TA貢獻1829條經驗 獲得超7個贊
這是我不理解的(我不是在爭辯,只是在不理解)。的設置IFS
應引用在其中read
執行的環境,但應$var
作為輸入重定向的一部分進行擴展,該環境應在執行之前read
。此外,在不加引號的情況下,字符串似乎確實是一個單詞,分配給var1
,然后拆分為var1
gets hello
和world
,而不是hello:world
。
- 3 回答
- 0 關注
- 459 瀏覽
添加回答
舉報