使用tr命令按制表符拆分字符串不生效,脚本无输出如何解决
问题原因
- 全局设置
IFS=""是核心问题:Shell的IFS(内部字段分隔符)默认包含空格、制表符、换行符,负责字符串到数组/字段的拆分逻辑。手动将IFS设为空后,执行arr=($(echo $l | tr "\t" " "))时,即使tr已经把制表符替换为空格,Shell也不会按空格拆分字符串,整行内容会全部存入arr[0],arr[1]为空,因此没有任何内容输出。 for l incat gift.txt``的写法本身存在缺陷:搭配空IFS设置时,整个文件的内容会被当成单个字符串赋值给l,无法实现逐行读取的预期。
解决方法
推荐直接使用read命令按制表符拆分字段,无需额外调用tr,性能和可靠性更高:
#!/bin/bash while IFS=$'\t' read -r id item; do echo "$item" done < gift.txt
如果要保留原有tr的实现逻辑,删除全局的IFS=""设置,同时将逐行读取逻辑改为更稳定的while read写法即可:
#!/bin/bash while read -r l; do arr=($(echo "$l" | tr "\t" " ")) echo ${arr[1]} done < gift.txt
内容的提问来源于stack exchange,提问作者seqwait
相关产品推荐
相关产品推荐

