bluesoat 2024-02-16 13:02 采纳率: 0%
浏览 4

关于内外循环中,全局变量值引用的困惑

在下面这段代码摘自书上,但是IFS值在外循环执行第一次循环后,不是被内循环改变了吗?为什么后面的外循环还能用循环外设置的值?


IFS=$'\n'
for entry in $(cat /etc/passwd)
do
        echo "Values in $entry"
        IFS=:
        for value in $entry
        do
                echo "  $value"
        done
        printf "\n"
done

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-16 13:03
    关注

    引自免费微信小程序:皆我百晓生

    在给出的Shell脚本代码段中,IFS(Internal Field Separator)是一个全局变量,用于定义字段分隔符。在这个例子中,IFS在外循环和内循环中有不同的用途。

    1. 外层循环中的 IFS 设置

    IFS=$'\n'
    

    这一行设置环境变量 IFS 为换行符(\n),这意味着在执行 for entry in $(cat /etc/passwd) 这一行时,会以文件 /etc/passwd 中的每一行作为entry的值进行迭代。

    2. 内层循环中的 IFS 重置

    IFS=:
    

    在内层循环开始之前,又将 IFS 设置为了冒号(:, 这是 /etc/passwd 文件中各字段之间的分隔符)。这样,在执行 for value in $entry 时,能够按照冒号分割每一行的内容,并将每个字段赋值给 value

    关于你的困惑:

    虽然内层循环改变了 IFS 的值,但它只在当前作用域(即内层循环内部)生效。每次内层循环结束后,由于没有明确地恢复外层循环之前的 IFS 值,理论上下一个外层循环迭代可能会受到影响。然而,在 Shell 脚本中,每个新的命令(如下一次外层循环迭代中的 for 循环)都会获取到外部作用域的最新 IFS 值,也就是外层循环开头设置的那个值(即换行符)。

    所以实际上,在这段代码中,尽管内层循环修改了 IFS,但每次内层循环结束并继续执行下一次外层循环时,外层循环的 IFS 值并未被永久改变,它总是会被重新初始化为 $'\n'

    总结来说,每次外层循环迭代开始前,IFS 都会被重新设定为换行符,因此不会影响后续的外层循环处理。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月16日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵