我正在尝试创建一个 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 中使用。