1

我正在尝试编写一个while循环来确定给出的数字倒数到0。此外,如果没有给出参数,则必须显示“没有给出参数。

现在我让它倒计时,但最后一个数字不是 0,并且在倒计时时它从数字 1 开始。我必须使用 while 循环。

我的新脚本。

 if [ $# -eq "0" ] ;then
       echo "No paramters given"
 else
       echo $#
  fi

 COUNT=$1
 while [ $COUNT -gt 0 ] ;do
         echo $COUNT
         let COUNT=COUNT-1
  done
  echo Finished!

这就是我的输出。

 sh countdown.sh 5
1
5
4
3
2
1
Finished!

我需要它达到 0

4

4 回答 4

2

@Slizzered 已经在评论中发现了您的问题:

  • 您需要运算符-ge(大于或等于) 而不是-gt(大于) 才能倒数到0.
  • 至于为什么1先打印:这仅仅是由于循环之前echo $#语句。while

如果您正在使用bash,您还可以考虑使用这种惯用的重新表述来简化您的代码:

#!/usr/bin/env bash

# Count is passed as the 1st argument.
# Abort with error message, if not given.
count=${1?No parameters given}

# Count down to 0 using a C-style arithmetic expression inside `((...))`.
# Note: Increment the count first so as to simplify the `while` loop.
(( ++count )) 
while (( --count >= 0 )); do
  echo $count
done

echo 'Finished!'
于 2015-04-18T19:10:42.060 回答
0

您还应该在算术上下文中使用它之前验证变量。否则,用户可以构造一个参数,该参数将导致脚本在无限循环中运行或达到递归限制和段错误。

此外,不要使用大写的变量名,因为您可能会覆盖特殊的 shell 变量和环境变量。并且不要[在 bash 中使用;更喜欢上级[[((构造。

#!/usr/bin/env bash
shopt -s extglob     # enables extended globs

if (( $# != 1 )); then
    printf >&2 'Missing argument\n' 
    exit 1
elif [[ $1 != +([0-9]) ]]; then
    printf >&2 'Not an acceptable number\n'
    exit 2
fi

for (( i = $1; i >= 0; i-- )); do
    printf '%d\n' "$i"
done

# or if you insist on using while
#i=$1
#while (( i >= 0 )); do
#    printf '%d\n' "$((i--))"
#done
于 2015-04-18T19:17:36.060 回答
0

您的代码远不能运行。所以,我不知道从哪里开始解释。让我们来看看这个小脚本:

#!/bin/sh

die() {
   echo $1 >&2
   exit 1;
}

test -z "$1" && die "no parameters given"
for i in $(seq $1 -1 0); do
   echo "$i"
done

主要部分是seq执行您需要的例程:从开始值计数到结束值(之间有增量)。起始值为$1,我们脚本的参数,增量为 -1。该test行测试命令行上是否有参数 - 如果没有,脚本通过 subroutine 结束die

嗯。

于 2015-04-18T17:52:27.013 回答
-1

有很多方法可以做到这一点,但一般的方法是从给定的数字循环到结束数字,每次迭代都会减少循环计数。C风格的 for 循环和任何东西一样有效。您将调整该sleep值以获得您喜欢的时间。您还应该验证脚本需要的输入数量和类型。一种这样的方法是:

#!/bin/bash

[ -n "$1" ] || {
    printf " error: insufficient input. usage:  %s number (for countdown)\n" "${0//*\//}"
    exit 1
}

[ "$1" -eq "$1" >/dev/null 2>&1 ] || {
    printf " error: invalid input. number '%s' is not an integer\n" "$1"
    exit 1
}

declare -i cnt=$(($1))

printf "\nLaunch will occur in:\n\n"

for ((i = cnt; i > 0; i--)); do

    printf " %2s\n" "$i"
    sleep .5

done

printf "\nFinished -- blastoff!\n\n"

exit 0

输出

$ bash ./scr/tmp/stack/countdown.sh 10

Launch will occur in:

 10
  9
  8
  7
  6
  5
  4
  3
  2
  1

Finished -- blastoff!

你的方法

您的方法很好,但您需要COUNT $COUNT在表达式中使用值。您还应该declare -i COUNT=$1告诉 shell 将其视为整数:

#!/bin/bash

if [ $# -eq "0" ] ;then
    echo "No paramters given"
else
    echo -e "\nNumber of arguments: $#\n\n"
fi

declare -i COUNT=$1

while [ $COUNT -gt 0 ] ;do
    echo $COUNT
    let COUNT=$COUNT-1
done
echo -e "\nFinished!\n"
于 2015-04-18T18:37:16.653 回答