Bash脚本分割显示文件行时返回值异常问题咨询
问题与解决
问题描述
编写了一段Bash脚本,用于读取test.txt首行内容并以冒号为分隔符分割,但执行后控制台输出缺失预期的"left"前缀,仅当文件只有一行时无此问题。
脚本代码:
#!bin/bash string=$(head -n 1 test.txt) IFS=":" read -r pathfile line <<< "$string" echo "left"$line"right"
test.txt内容:
filepath:file content others lines ...
执行返回:
rightfile content
问题原因
- 换行符格式问题:如果test.txt是Windows格式(行尾为
\r\n),head -n 1读取首行时会将结尾的\r(回车符)一并带入变量string。当read按冒号分割后,line变量会包含file content\r,其中\r会使输出光标回到行首,导致后续的"right"覆盖掉前面的"left",最终出现异常输出。 - 脚本小错误:脚本开头的
#!bin/bash缺少斜杠,正确写法应为#!/bin/bash,不过这不是导致当前问题的直接原因。
解决方法
- 方法一:转换文件格式
将Windows格式的test.txt转为Unix格式,使用命令:dos2unix test.txt - 方法二:读取时过滤回车符
修改读取首行的命令,去掉可能存在的\r:string=$(head -n 1 test.txt | tr -d '\r') - 优化read命令用法
若要将冒号后的所有内容统一存入一个变量,可调整read的变量名(避免歧义),同时建议在使用完IFS后恢复默认值,避免影响后续命令:#!/bin/bash string=$(head -n 1 test.txt | tr -d '\r') OLD_IFS=$IFS IFS=":" read -r pathfile rest_content <<< "$string" IFS=$OLD_IFS echo "left${rest_content}right"
内容的提问来源于stack exchange,提问作者Chlamy
相关产品推荐
相关产品推荐

