#!/bin/sh
i=1
for day in mon tue wed thu fri
do
echo "weekday $((i++)) : $day"
if [ $i -eq 3 ];then
break;
fi
done
我使用调试模式来检查它将如何工作
在这里我不明白变量(i)它将如何工作形式凝视结束。你能给我一些解释吗?
- I = 1
- 在星期一的星期三星期五星期五星期日
- echo'工作日1:周一'工作日1:星期一
- ' [' 2 -eq 3']'
- 在星期一的星期三星期五星期五星期日
- echo'工作日2:星期二'工作日2:星期二
- ' [' 3 -eq 3']'
- 断裂
答案 0 :(得分:1)
(首先你要混用来自bash的语法(例如$((...))
),同时使用#!/bin/sh
作为解释器,因此很难肯定地说会发生什么。)如果你从{获得数值评估{1}},你的shell(无论哪个)正在正确解释$((...))
当你在循环中调用$((...))
时,正在发生的事情以及你在bash等中所期望的是i
显式增加。当您开始编写脚本时,设置$((i++))
并保持该值,直到您开始循环。当你开始循环时,例如:
i=1
循环变量为for day in mon tue wed thu fri
do
,因此day
将采用值day
,mon
,tue
,wed
和{{1}通过循环每次连续迭代。但thu
会在每次迭代时增加fri
:
i
正在发生的事情1
与echo "weekday $((i++)) : $day"
相同,(如果您对此更熟悉,则为$((i++))
)。您正在使用的算术语法可用于测试本身或算术。如果在没有前导i=$((i+1))
的情况下调用,则会评估i=$(expr $i + 1)
之间的数学表达式并更新所有变量值。
如果使用前导'$'
进行调用,则会发生相同的评估/更新,但该值将被取消引用,并且表达式的值在取消引用时可用,与执行相同的操作无异。变量。 (例如((..))
)。
在您的情况下,您正在评估(使用后增量运算符)并使用'$'
中的i=1; echo "i $i"
取消引用。所以你希望它输出:
'$'
因为echo "weekday $((i++)) : $day"
在每个循环期间更新到weekday 1 : mon
weekday 2 : tue
,然后你会期望循环退出:
i
发生了什么。如果您有任何其他问题,请与我们联系。
注意: i=3
语法不是POSIX shell规范的一部分,因此我不希望您的脚本可以使用 if [ $i -eq 3 ];then
break;
fi
移植。实际上很多分发只是softlink $((...))
,所以我怀疑你的情况就是这样。