Bash按分隔符拆分字符串时空值丢失问题咨询
Bash拆分含空元素字符串时丢失空值的问题解决
你遇到的问题根源是bash的单词分割机制:当你用空格(或换行)作为分隔符进行数组赋值时,bash会自动忽略连续的空白字符,直接跳过空元素,导致原字符串里的,,对应的空值被丢弃,baz就往前移了一位。
错误方法的问题分析
- 方法1:
array=(${LINE//,/ })是把所有逗号替换成空格,数组赋值时bash会把连续空格视为单个分隔符,两个逗号替换成两个空格后会被合并,中间的空元素直接消失。 - 方法2:
array=($(echo "$LINE" | tr ',' '\n'))虽然用tr把逗号换成换行,但$(...)的输出在数组赋值时依然会触发单词分割,连续的换行(对应原字符串的,,)会被当作空白忽略,空元素同样丢失。
两种正确的拆分方法
方法1:用read结合IFS保留空元素
LINE=foo,bar,,baz IFS=, read -ra array <<< "$LINE" # 验证结果 echo "${array[2]}" # 输出空值(符合预期) echo "${array[3]}" # 输出baz
IFS=,指定逗号为分隔符,-a参数将拆分结果存入数组,<<< "$LINE"把变量内容作为输入传递给read,这种方式会完整保留连续分隔符之间的空元素。
方法2:用mapfile(Bash 4.0+)逐行读取
LINE=foo,bar,,baz mapfile -t array < <(tr ',' '\n' <<< "$LINE") # 验证结果 echo "${array[2]}" # 输出空值 echo "${array[3]}" # 输出baz
mapfile会逐行读取输入并将每行内容存入数组,tr ',' '\n'把逗号替换成换行后,原字符串的空元素对应空行,会被mapfile正常存入数组,不会丢失。
内容的提问来源于stack exchange,提问作者mbxzxz
相关产品推荐
相关产品推荐

