用于检查号码是否为阿姆斯壮的BASH脚本

时间:2010-06-16 08:20:13

标签: bash unix

我正在编写一个脚本来检查一个号码是否是阿姆斯特朗。这是我的代码

echo "Enter Number"
read num
sum=0
item=$num
while [ $item -ne 0 ]
do
rem='expr $item % 10'
cube='expr $rem \* $rem \* $rem'
sum='expr $sum + $cube'
item='expr $item / 10'
done
if [ $sum -eq $num ]
then
echo "$num is an Amstrong Number"
else
echo "$num is not an Amstrong Number"
fi

运行此脚本后,

$ ./arm.sh

我总是得到这些错误

第5行:[:参数太多

第12行:[:参数太多

我在cygwin上。

2 个答案:

答案 0 :(得分:1)

这些是expr命令中的直接引号。要评估表达式,您需要使用反引号:

rem=`expr $item % 10`

答案 1 :(得分:1)

错误来自[]命令中缺少的引号:[ "$item" -ne 0 ]。但是,不要将[]用于算术表达式。相反,使用(()):

while((item!= 0));做...完成

另外,你对阿姆斯壮数的计算似乎是错误的。为什么要立方体?在这种情况下,您需要检查num是否正好有三位数,不是吗? http://en.wikipedia.org/wiki/Narcissistic_number

假设你真的意味着“阿姆斯特朗号”的标准定义,这应该有效:

#!/bin/sh -eu

is_armstrong() {
  local num digits sum
  num="$1"
  case "$num" in
  # Reject invalid numerals.
  (*[^0-9]*|0?*) echo "$num: invalid numeral." >&2; return 1;;
  esac
  digits=${#num}
  sum=0
  while ((num > 0)); do
    ((sum += (num % 10) ** digits))
    ((num /= 10))
  done
  ((sum == $1))
}

# Prompt the user for a number if none were give on the command line.
if (($# == 0)); then
  read -p "Enter a natural number: " num
  set -- "$num"
fi

# Process all the numbers.
for num in "$@"; do
  num=$((num + 0))  # canonicalize the numeric representation
  if is_armstrong "$num"; then
    echo "$num is an Amstrong Number"
  else
    echo "$num is not an Amstrong Number"
  fi
done