Shell脚本遍历tail输出时空格被识别为换行的解决求助
问题原因
你遇到的问题是因为Shell默认会将$(tail -n 2 ${file})的输出按**IFS(内部字段分隔符,默认包含空格、制表符、换行)**拆分,每一个单词都会被当作for循环的单独迭代元素,所以最终每个单词单独占一行输出。
解决方案
最可靠的方式是使用while read循环来逐行读取tail的输出,它会完整保留每一行的内容(包括空格):
file=extract.txt tail -n 2 "${file}" | while read -r line do echo "${line}" done
细节说明:
-r参数给read命令,用于禁止将行内的反斜杠解析为转义字符,确保行内容完全保留原始状态- 用管道将
tail的输出传递给while read,每一行都会被完整读取到line变量中 - 引用
"${line}"而非直接写$line,避免变量展开时再次触发分词
如果需要在循环内修改的变量能在循环外部生效(管道会创建子shell,子shell内的变量无法传递到父shell),可以改用进程替换的写法:
file=extract.txt while read -r line do echo "${line}" done < <(tail -n 2 "${file}")
内容的提问来源于stack exchange,提问作者user3539927
相关产品推荐
相关产品推荐

