求助解析一段Linux Shell脚本的执行原理(已知输出)
Linux Shell脚本执行原理与结果推导解析
先把原脚本贴出来:
#!/bin/sh i=0 for a in 9 8 7 6 5 4 do j=1 for b in 1 2 3 4 do let "j+=2" done let "i+=1" done echo "i=$i j=$j"
咱们一步步拆解它的执行逻辑,搞清楚最终输出是怎么来的:
1. 初始状态
脚本第一行就给变量i赋值为0,这是整个脚本的起始状态。
2. 外层循环的执行次数
外层for循环遍历的是列表9 8 7 6 5 4,数一下就能知道这个列表有6个元素,所以外层循环会完整执行6次。
每次进入外层循环,第一件事就是把变量j重置为1——划重点:每次外层循环启动都会覆盖j的旧值,所以j的初始值在每一轮外层循环里都是1。
3. 内层循环的计算过程
内层for循环遍历的是列表1 2 3 4,一共4个元素,所以每轮外层循环里,内层循环会跑4次。
内层循环里只有一行核心代码:let "j+=2",意思是把j的数值加2,再重新赋值给j。咱们算一遍每次内层循环后j的变化:
- 第1次内层循环:j = 1 + 2 = 3
- 第2次内层循环:j = 3 + 2 = 5
- 第3次内层循环:j = 5 + 2 = 7
- 第4次内层循环:j = 7 + 2 = 9
所以每轮内层循环结束后,j的值都会固定变成9。
4. 外层循环对i的累加
内层循环跑完后,外层循环会执行let "i+=1",也就是把i的数值加1。因为外层循环要跑6次,i从初始的0开始累加,6次后i的值就是0 + 6 = 6。
5. 最终输出结果
当所有循环都执行完毕后,脚本执行echo "i=$i j=$j"。此时i的值是6,j的值是最后一轮外层循环里内层计算出的9,所以最终输出内容是:
i=6 j=9
这里补充个小知识点:在sh脚本里,默认定义的变量都是全局变量,所以哪怕j是在外层循环内部定义的,整个脚本都能访问到它,最后echo的时候才能输出j的最终值。
内容的提问来源于stack exchange,提问作者HankySpanky
相关产品推荐
相关产品推荐

