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
相关产品推荐
相关产品推荐

