如何用单个read命令将多行文本读取到多个变量中?
解决方法
可以通过单个read命令实现,需要同时调整输入终止符并正确传递多行数据:
# 方法1:利用默认IFS(含换行)拆分字段 read -r -d $'\0' num1 num2 name <<< "$data"$'\0' # 方法2:显式指定IFS为换行,确保严格按行拆分 IFS=$'\n' read -r -d '' num1 num2 name <<< "$data"$'\0'
原命令失败原因
- 未给
$data加双引号:<<< $data会让bash将$data中的换行符替换为空格,所有内容合并成一行,导致只有第一个变量被赋值。必须用<<< "$data"才能保留原始换行格式。 - 终止符设置逻辑错误:默认
read遇到换行就停止读取,所以只拿到第一行。用-d $'\0'(或-d '',二者等价)将终止符改为空字符后,原输入中没有空字符,read会一直等待输入直到EOF,此时退出码非零,触发set -e选项终止脚本。在输入末尾追加$'\0'就能让read正常读取并返回0退出码。
补充说明
-r选项用于禁止反斜杠转义,避免意外修改输入内容,建议始终添加。- 如果
data变量本身包含空字符,上述方法会失效,此时可改用readarray读取到数组后再赋值:readarray -t arr <<< "$data" num1=${arr[0]} num2=${arr[1]} name=${arr[2]}
内容的提问来源于stack exchange,提问作者Mikhail T.
相关产品推荐
相关产品推荐

