我正在编写一个脚本来检查一个号码是否是阿姆斯特朗。这是我的代码
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上。
答案 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