为何我的Bash脚本会截断最后一个输入值?
Bash脚本第二个while循环无法读取最后一个字段的原因及解决办法
问题描述
编写的Bash脚本如下:
#!/bin/bash #set -x OLD_IFS=$IFS counter=0 while [ $counter -lt 2 ] && IFS= read -r -p "Enter row $(($counter+1)): " row; do echo "whole row: $row" while read -d " " char; do echo "$char" done <<<$row ((counter++)) done IFS=$OLD_IFS
实际运行情况:
输入:
./ex8.07.sh Enter row 1: 1 2 3 4 5
输出:
whole row: 1 2 3 4 5 1 2 3 4 Enter row 2:
疑问:为何第二个while循环无法访问数字5?
原因分析
问题出在read -d " "的行为逻辑上:read -d指定的是终止分隔符,只有当读取到这个分隔符时,才会将之前的内容赋值给变量并执行循环体。你的输入字符串1 2 3 4 5最后没有空格,最后一个字段5后面没有触发终止的空格,当read读到输入末尾时,会直接退出循环,不会处理这个没有被分隔符结尾的字段。
解决办法
方法一:给输入字符串末尾补空格
修改第二个while循环的输入,在$row后加一个空格,确保最后一个字段后有分隔符:
while read -d " " char; do echo "$char" done <<<"$row "
方法二:改用for循环遍历字段
如果只是要拆分空格分隔的字段,用for循环更简单,它会自动按默认的IFS(空格、制表符、换行)分割所有字段,无需处理分隔符问题:
echo "whole row: $row" for char in $row; do echo "$char" done
内容的提问来源于stack exchange,提问作者Surepic 342
相关产品推荐
相关产品推荐

