我写了这个示例 KornShell (ksh) 代码,但在 if 子句期间出现错误的替换错误。
while ((i < $halflen))
do
if [[${strtochk:i:i}==${strtochk:j:j}]];then
i++
j--
else
ispalindrome = false
fi
done
请帮忙。
注意:我使用的是ksh88
,而不是ksh93
。
shell 语法对空格非常敏感:
-
[[
恰好是命令的名称,它不仅仅是语法,所以它后面必须有一个空格。 [[
的最后一个参数必须]]
,所以它前面需要有一个空格。-
[[
的工作方式因接收的参数数量而异,因此您希望在==
周围留有空格 - 在变量赋值中,
=
两边不能有空格。
技巧:
- 一旦你发现它不是一个回文,
break
出while循环 - 您可能正在逐个字符检查,因此您需要
${strtochk:i:1}
-
i++
和j--
是算术表达式,而不是命令,因此您需要双括号。 - 您是从
i=0
和j=$((${#strtochk} - 1))
开始的吗?
while ((i < halflen))
do
if [[ ${strtochk:i:1} == ${strtochk:j:1} ]];then
((i++))
((j--))
else
ispalindrome=false
break
fi
done
检查您的系统是否有rev
,然后您只需执行以下操作:
if [[ $strtochk == $( rev <<< "$strtochk" ) ]]; then
echo "'$strtochk' is a palindrome"
fi
function is_palindrome {
typeset strtochk=$1
typeset -i i=1 j=${#strtochk}
typeset -i half=$(( j%2 == 1 ? j/2+1 : j/2 ))
typeset left right
for (( ; i <= half; i++, j-- )); do
left=$( expr substr "$strtochk" $i 1 )
right=$( expr substr "$strtochk" $j 1 )
[[ $left == $right ]] || return 1
done
return 0
}
if is_palindrome "abc d cba"; then
echo is a palindrome
fi
您正在使用ksh88
但您尝试的代码正在使用 88 版本缺少ksh93
功能。
您需要更换
if [[${strtochk:i:i}==${strtochk:j:j}]];then
使用这些便携式生产线:
if [ "$(printf "%s" "$strtochk" | cut -c $i)" =
"$(printf "%s" "$strtochk" | cut -c $j)" ]; then
和不正确的:
i++
j--
跟:
i=$((i+1))
j=$((j-1))