此 Bash 脚本在运行时会产生多个“预期整数表达式”错误:
echo "Enter string"
read str
len=`echo $str|wc -c`
len=`expr $len - 1`
i=0
j=1
l=`expr $len / 2`
while [ $i -le $l ]
do
start=`echo $str|cut -c $j`
end=`echo $str|cut -c $len`
echo $start
echo $end
if [ $start -ne $end ]
then
echo "not palindrome"
exit 0
fi
len=`expr $len - 1`
i=`expr $i + 1`
j=`expr $j + 1`
done
echo "string is palindrome"
这是输出,包括错误:
Enter string
saurabh
s
h
main.bash: line 18: [: s: integer expression expected
a
b
main.bash: line 18: [: a: integer expression expected
u
a
main.bash: line 18: [: u: integer expression expected
r
r
main.bash: line 18: [: r: integer expression expected
string is palindrome
脚本中有什么错误?
答案1
您可以而且应该使用,而不是使用诸如wc
、expr
、之类的外部命令cut
bash 内部字符串操作命令。此外,您的脚本适合使用bash 算术运算。
因此,我修改了您的脚本,如下所示。另请参阅脚本中的我的评论。
#!/bin/bash
echo -n "Enter a string > "
read str
#len=`echo $str|wc -c`
#len=`expr $len - 1`
# You could use just `echo -n ...` and skipped the subtraction.
# But, for a better alternative use this:
let len=${#str}
let i=0
let j=1
#l=`expr $len / 2`
let l=len/2
while (( i < l )) ; do
#start=`echo $str|cut -c $j`
start=${str:j-1:1}
#end=`echo $str|cut -c $len`
end=${str:len-1:1}
echo "$start" '=?' "$end"
if [[ "$start" != "$end" ]] ; then
echo "Not a palindrome"
exit 0
fi
#len=`expr $len - 1`
let len=len-1
#i=`expr $i + 1`
let i++
#j=`expr $j + 1`
let j++
done
echo "String is a palindrome"
这个脚本还可以进一步优化。这留给你们练习吧!☺
请注意,如果您在测试字符串中使用非 ASCII 字符,则应设置适当的语言环境。例如:
$ LANG=C.UTF-8 ./pal.sh
Enter string > ΝΙΨΟΝΑΝΟΜΗΜΑΤΑΜΗΜΟΝΑΝΟΨΙΝ
Ν =? Ν
Ι =? Ι
Ψ =? Ψ
Ο =? Ο
Ν =? Ν
Α =? Α
Ν =? Ν
Ο =? Ο
Μ =? Μ
Η =? Η
Μ =? Μ
Α =? Α
String is a palindrome
$ LANG=C ./pal.sh
Enter string > ΝΙΨΟΝΑΝΟΜΗΜΑΤΑΜΗΜΟΝΑΝΟΨΙΝ
� =? �
Not a palindrome