You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:39:55