无法调试简单的ksh程序

时间:2014-01-06 17:05:40

标签: shell unix scripting ksh

我编写了这个示例KornShell(ksh)代码,但在if子句中它的替换错误很少。

while ((i < $halflen))
do
 if [[${strtochk:i:i}==${strtochk:j:j}]];then
       i++
       j--
 else
  ispalindrome = false
 fi
done

请帮忙。

注意:我使用的是ksh88,而不是ksh93

2 个答案:

答案 0 :(得分:2)

shell语法非常敏感:

  • [[实际上是命令的名称,它不仅仅是语法,因此必须有一个空格。
  • [[的最后一个参数必须是]],因此需要在空格之后。
  • [[的工作方式会有所不同,具体取决于收到的参数数量,因此您希望==周围有空格
  • 在变量赋值中,=
  • 周围不能有空格

提示:

  • 一旦你发现它不是一个回文,break在while循环之外
  • 您可能正在逐个字符地检查,因此您需要${strtochk:i:1}
  • i++j--是算术表达式,而不是命令,所以你需要双括号。
  • 您是从i=0j=$((${#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

答案 1 :(得分:1)

您使用的是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))