Shell脚本我有使用for循环的代码

时间:2015-10-23 12:26:21

标签: shell

#!/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 = 1
  •   
  • 在星期一的星期三星期五星期五星期日
  •   
  • echo'工作日1:周一'工作日1:星期一
  •   
  • ' [' 2 -eq 3']'
  •   
  • 在星期一的星期三星期五星期五星期日
  •   
  • echo'工作日2:星期二'工作日2:星期二
  •   
  • ' [' 3 -eq 3']'
  •   
  • 断裂
  •   
在这里我不明白变量(i)它将如何工作形式凝视结束。你能给我一些解释吗?

1 个答案:

答案 0 :(得分:1)

(首先你要混用来自bash的语法(例如$((...))),同时使用#!/bin/sh作为解释器,因此很难肯定地说会发生什么。)如果你从{获得数值评估{1}},你的shell(无论哪个)正在正确解释$((...))

当你在循环中调用$((...))时,正在发生的事情以及你在bash等中所期望的是i显式增加。当您开始编写脚本时,设置$((i++))并保持该值,直到您开始循环。当你开始循环时,例如:

i=1

循环变量为for day in mon tue wed thu fri do ,因此day将采用值daymontuewed和{{1}通过循环每次连续迭代。但thu会在每次迭代时增加fri

i

正在发生的事情1echo "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 $((...)),所以我怀疑你的情况就是这样。