首页 > 解决方案 > 循环在 git 操作中无法正常工作

问题描述

循环在 git 操作中无法正常工作。

我的 task.sh 看起来像这样:

#!/bin/bash

range=100
number=$((RANDOM % range))

while [ "$i" -le "$number" ]; do
    echo "DATE: $1" >> date.txt
done

上面代码的结果是:

./task.sh: 6: [: Illegal number:

下面的代码工作正常。

echo "DATE: $1" >> date.txt

我尝试了以下方法,但它也给出了错误。

#!/bin/bash

range=500
number=$((RANDOM % range))

for ((run=1; run <= number; run++)); do
    echo 'hello'
done

我很好奇您如何使下面的命令正常工作。

while (random(1-100)); do
     echo 'hello'
done

最好的祝福!

标签: bashshellsh

解决方案


它应该可以正常工作:

while [[ "$i" -le "$number" ]]; do
      ^^                    ^^

这需要 bash,但由于您的shebang#!/bin/bash,因此您的t.sh脚本将使用 bash 运行,无论其 ' .sh' 扩展名如何。

但以目前的形式,这将是一个无限循环。

您需要添加

i=$((i+1))

这将增加$i变量,使"$i" -le "$number"工作正常。

初始化i为 0 更好/更干净,但是[[ "" -le "$number" ]](在第一个循环中,仍然“有效”(因为空字符串被认为“低于或等于”非空“ $number”字符串,并保留在循环中)


话虽如此,该脚本更正确的形式/用法是(使用算术比较):

#!/bin/bash

range=100
number=$((RANDOM % range))
i=0

while (( i <= number )); do
    echo "DATE: ${i}" >> date.txt
    i=$((i+1))
done

或者,使用 c 风格的循环

#!/bin/bash

range=100
number=$((RANDOM % range))

for ((i = 0 ; i < number ; i++)); do
    echo "DATE: ${i}" >> date.txt
done

所有这一切都是假设bash的,但正如这里所见,由于for (( ... ))语法不是 POSIX,它不适用于 Alpine Linux 或其他sh链接到ash (Almquist shell) 或 Dash的操作系统。

在后一种情况下:

#!/bin/bash

range=100
number=$((RANDOM % range))

for i in $(seq 0 $number); do
    echo "DATE: ${i}" >> date.txt
done

推荐阅读