For Loop / If Condition在Shell脚本中的应用

5

我以前从未写过shell脚本,现在遇到一个简单的问题... 我有一个for循环,每次运行run.sh脚本时都会执行。为了查看脚本已经运行到哪里,我想打印出每5000个索引。

$counter = 0
for ((  i = 0 ;  i <= 5000;  i++  ))do
    if ($i =  $counter); then
            echo "$counter"
            counter=$(counter+1000)
    fi
./run.sh
done

运行这段代码会出现以下错误。
./for_loop.sh: line 1: =: command not found
./for_loop.sh: line 3: 0: command not found

我尝试使用以下方式初始化变量counter:
declare -i counter = 0

这使我得到了下面的错误

./for_loop.sh: line 1: declare: `=': not a valid identifier

1
在Bash中,有两个赋值运算符,=let =,因此您可以使用counter=0let counter=0来分配第一个计数器。 let仅用于数字,而=适用于任何字符串。 - Derek Mahar
你需要阅读一份关于Shell语法的教程,因为你有很多基本语法错误。 - Barmar
例如,在赋值时不需要在变量名前加上“$”,只有在读取变量时才需要。 - Barmar
3个回答

7

你其实不需要两个计数器。一个计数器就足够了:

for (( counter = 0; counter <= 5000; counter++ ))
do
    if (( counter % 1000 == 0 ))
    then
            echo "$(( counter / 1000 ))"
    fi
    ./run.sh
done

这将执行run.sh 5000次,并在每1000次迭代时打印计数器的值。请注意,%是模运算符,它计算除法后的余数,而/是整数除法运算符。


谢谢你提供的好解决方案! 命令echo "%(( counter / 1000 ))"实际上会打印出%(( counter / 1000 )),而不是counter/1000的结果。你知道问题出在哪里吗? - mkn
糟糕!%(( counter / 1000 )) 应该改为 $(( counter / 1000 ))。请将 % 替换为 $。我已经更正了我的答案。 - Derek Mahar
当然了...我本来可以自己找出来的 :) 再次感谢。 - mkn

4

第一行应该是:(没有$,=周围没有额外的空格)

counter=0

第三行应该是:(方括号,'-eq'因为'='用于字符串相等性)

if [ $i -eq $counter ]

第5行应该是:(双括号)
counter=$((counter+1000))

2
在for循环中,))do之间也应该有一个分号,或者do应该在下一行。 - Derek Mahar
for (( .. )) do 是怎样的呢?也就是说,最后一个右括号和 do 之间有一个空格?或许 Bash 将右括号作为分隔符替代了 ; - Derek Mahar
那也行。我猜for (()) do容易解析。但我同意在这里省略分号或换行符是不好的风格。 - schot
1
第3行也可以是if ((i == counter)); then(只需将括号和等号加倍,可以省略或保留美元符号)。第5行可以是(( counter += 1000 ))。另外,在第1行等号后面不应该有空格。 - Dennis Williamson
@Dennis 你说得一点没错:就像在perl中一样,有多种方法可以做到这一点。我通常写POSIX sh而不是bash。并且我删除了'='后面的空格。 - schot
显示剩余3条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接