在for循环条件中添加if语句

在for循环条件中添加if语句

我正在尝试创建一个 for 循环来最小化此代码,有什么想法吗?

hello=5
if [[ -n hello ]]; then 
    for ((n=0; n<hello; n++));
    do
        echo "Running: `ps $user | wc -l` instance(s) ...";
    done
else
    while :
    do
        echo "Running: `ps $user  | wc -l` instance(s) ...";
    done
fi

我尝试过类似的事情

for ((n=0;n<hello; [[ -n $hello ]] && n++ || n));

但这似乎不起作用。

这个想法很简单,如果 $hello 存在,则运行它指定的迭代次数,否则运行无限次。

答案1

除了使用 2147483647 (2 31 - 1) 或 999999999999999 等“足够大”的数字来表示“无限制”之外,使用 -1 或 0 等值来表示“无限制”是相对常见的。

我可能会选择这样的方法,因为 -1 是“无限制”:

#!/bin/bash
count=5
[ -n "$1" ] && count=$1
for ((i=0; count == -1 || i < count; i++)); do
    echo "doing something for the ${i}th time"
    sleep .1
done

或者你可以有一个单独的变量来判断限制是否存在:

has_limit=0
for ((i=0; ! has_limit || i < count; i++)); do
    ...

但当然,用户需要输入两个值,其中一个值使另一个值变得毫无意义。


至于这个:

for ((n=0;n<hello; [[ -n $hello ]] && n++ || n));

的内部for (( ... ))是算术上下文,因此您不能在其中运行任意 shell 代码。您可以按照我上面的方式进行操作,但至少我发现将此类测试放在for (( )).这样,您也可以保持不断增加的循环计数器,以防您需要计算迭代次数。

答案2

count=0

while true; do
    [ -n "$n" ] && [ "$count" -ge "$n" ] && break

    echo 'some string'
    sleep 1

    count=$(( count + 1 ))
done

这会将两个循环合并为一个while循环,该循环将一直运行直至break执行。当变量n不为空并且数值小于或等于变量的值时,就会发生这种情况count

如果n未设置或为空,则循环将一直运行,直到通过外部方式终止。

代码可以缩短为

count=0

until [ -n "$n" ] && [ "$count" -ge "$n" ]; do
    echo 'some string'
    sleep 1

    count=$(( count + 1 ))
done

这两个循环都应该可以在任何类似 POSIX 的 shell 中使用。

相关内容