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

MacOS下bash的while read与<<<用法失效问题排查

MacOS下bash脚本while read读取多行内容异常解决

问题现象

原脚本在Linux bash环境运行正常,移植到MacOS后,使用gdate时出现无效日期错误,报错信息显示date参数被传入了一整串连在一起的多行内容:

gdate: invalid date ‘2024-03-02T00:00:00Z expiresOn: 2024-06-30T00:00:00Z expiresOn: 2024-07-01T00:00:00Z ...’

问题根源

问题出在**here字符串(<<<)**的使用方式上:
<<<$(cat $file |grep expiresOn) 这种写法会把grep输出的所有换行符替换为空格,将多行内容合并成一整行输入给while循环。此时read -r key date会把整行的第一个单词赋值给key,剩下的所有内容全部塞给date,导致gdate接收到无效的日期参数。

解决方案

方案1:使用管道直接传递多行输入

直接通过管道将grep的输出传给while循环,天然保留换行符,实现逐行读取:

grep expiresOn "$file" | while read -r key date
do
    age=$(gdate -d "$date" +%s)
    # 这里编写你的业务处理逻辑
done

方案2:保留here字符串但包裹双引号

如果坚持使用here字符串,需要给命令替换结果加上双引号,强制保留换行符:

while read -r key date
do
    age=$(gdate -d "$date" +%s)
    # 这里编写你的业务处理逻辑
done <<<"$(grep expiresOn "$file")"

额外注意:所有引用文件名的地方(如"$file")都要加双引号,避免文件名包含空格或特殊字符时出现意外问题。

内容的提问来源于stack exchange,提问作者martyzee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:53:17