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'