亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試將字符串分成兩個變量

嘗試將字符串分成兩個變量

DIEA 2019-11-04 09:58:19
我正在嘗試將字符串分成兩個變量(而不必使用while循環):var="hello:world"IFS=':' read var1 var2 <<< $varecho "var1: $var1"echo "var2: $var2"但我沒有得到預期的結果:var1: 'hello world'var2: ''有人可以解釋一下是否可以這種方式(或類似方式)嗎?
查看完整描述

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=


查看完整回答
反對 回復 2019-11-04
?
汪汪一只貓

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。


查看完整回答
反對 回復 2019-11-04
?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

這是我不理解的(我不是在爭辯,只是在不理解)。的設置IFS應引用在其中read執行的環境,但應$var作為輸入重定向的一部分進行擴展,該環境應執行之前read。此外,在不加引號的情況下,字符串似乎確實是一個單詞,分配給var1,然后拆分為var1gets helloworld,而不是hello:world

查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 459 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號