Bash 脚本中出现“[: s: 预期整数表达式”错误

Bash 脚本中出现“[: s: 预期整数表达式”错误

此 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

您可以而且应该使用,而不是使用诸如wcexpr、之类的外部命令cutbash 内部字符串操作命令。此外,您的脚本适合使用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

相关内容