为什么GNU bash中的这个for循环无法按预期拆分字符串输出?
问题原因
- 该现象核心是Bash变量展开时没有触发预期的单词拆分逻辑,通常由两种情况导致:
- 环境中的
IFS(内部字段分隔符)被修改过:Bash默认IFS包含空格、制表符、换行符,会按这三类字符拆分未加引号的变量内容。如果此前执行过IFS=''、IFS=$'\n'这类自定义IFS的操作,空格就不会被识别为拆分边界,整个字符串会作为单个循环项处理。 - 实际执行的代码中变量被误加了双引号:如果实际运行的是
for learn in "$learn",双引号会强制禁止变量展开后的单词拆分,直接把完整字符串作为一个元素传入循环。
- 环境中的
修复方法
你可以先将IFS重置为默认值,再运行代码即可实现按空格逐行输出单词:
# 重置IFS为默认配置 IFS=$' \t\n' learn="Start learning from Javatpoint." for word in $learn do echo $word done echo "Thank You."
注:建议循环变量不要和外部变量重名,避免变量值被意外覆盖,上述示例已经把循环变量改为word。
内容的提问来源于stack exchange,提问作者ByteBanter
相关产品推荐
相关产品推荐

