On Thu, 2 Jan 2014 11:35:11 -0800, "P Fudd" <f...@ch.pkts.ca> wrote:
> Here's some more oddities: Ok, the link I sent you is more about the issue you describe in your first message. See below for more on the new ones in this message. > =====failing.sh: > #!/bin/bash > R="1|2" > IFS='|' read -r A B <<< $R > echo A=$A, B=$B > ==== > Expected: "A=1, B=2" > Actual: "A=1 2, B=" Here $R is expanded and wordsplitted using IFS before read is executed, which means that $R does *not* contain any pipe symbol at the time "read" is executed, so $A gets the whole thing. > ====fail2.sh: > #!/bin/bash > R="1|2" > while IFS='|' read -r A B; do > echo 1:A=$A, B=$B > done <<< $R > echo 2:A=$A, B=$B > ==== > Expected: > 1:A=1, B=2 > 2:A=1, B=2 > Actual: > 1:A=1, B=2 > 2:A=, B= This is slightly different, as when $R is expanded, IFS is still the default, so it's expanded to "1|2" as expected, and the alternate IFS is only in effect during the while/read loop. As expected, after the first loop iteration $A is 1 and $B is 2. However read is executed once more, and that second execution reads nothing, thus obviously setting both A and B empty. Run with "set -x" and you'll see it yourself. -- D.