Configuration Information [Automatically generated, do not change]:
Machine: aarch64
OS: darwin23.4.0
Compiler: clang
Compilation CFLAGS: -DSSH_SOURCE_BASHRC
-DDEFAULT_LOADABLE_BUILTINS_PATH='/opt/homebrew/Cellar/bash/5.2.37/lib/bash:/usr/local/lib/bash:/usr/lib/$
Machine Type: aarch64-apple-darwin23.4.0

Bash Version: 5.2
Patch Level: 37
Release Status: release

Description:

It seems that `read` truncates a trailing delimiter if there is one less
variable argument than input fields and the last field is empty (trailing
delimiter).

See how output line 1 contains the trailing comma, but output line 3 does
not. Is this intended behaviour? It's messing up my data parsing by
dropping empty fields.

Repeat-By:

Issue occurs on output line 3 here, but not on output line 1:

> for row in "k,v1,v2," "k,v1,v2" "k,v1," "k,v1" "k,"; do
> IFS=, read k v <<<"$row"
> printf "%-20s %s\n" "row='$row'" "k='$k', v='$v'"
> done
row='k,v1,v2,'       k='k', v='v1,v2,'
row='k,v1,v2'        k='k', v='v1,v2'
row='k,v1,'          k='k', v='v1'
row='k,v1'           k='k', v='v1'
row='k,'             k='k', v=''

Issue occurs on output line 3 here, but not on output line 1:

> for row in "k,v1,v2,v3," "k,v1,v2,v3" "k,v1,v2," "k,v1,v2" "k,v1,"; do
> IFS=, read k v1 vRem <<<"$row"
> printf "%-20s %s\n" "row='$row'" "k='$k', v1='$v1', vRem='$vRem'"
> done
row='k,v1,v2,v3,'    k='k', v1='v1', vRem='v2,v3,'
row='k,v1,v2,v3'     k='k', v1='v1', vRem='v2,v3'
row='k,v1,v2,'       k='k', v1='v1', vRem='v2'
row='k,v1,v2'        k='k', v1='v1', vRem='v2'
row='k,v1,'          k='k', v1='v1', vRem=''

Issue occurs on output line 5 here, but not on output lines 1 or 3:

> for row in "k,v1,v2,v3," "k,v1,v2,v3" "k,v1,v2," "k,v1,v2" "k,v1,"; do
> IFS=, read k v <<<"$row"
> printf "%-20s %s\n" "row='$row'" "k='$k', v='$v'"
> done
row='k,v1,v2,v3,'    k='k', v='v1,v2,v3,'
row='k,v1,v2,v3'     k='k', v='v1,v2,v3'
row='k,v1,v2,'       k='k', v='v1,v2,'
row='k,v1,v2'        k='k', v='v1,v2'
row='k,v1,'          k='k', v='v1'

Reply via email to