2014-01-06 2 views
1

Я написал этот образец кода KornShell (ksh), но во время предложения if он получает плохую ошибку замещения.Не удается отладить простую программу ksh

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

Пожалуйста, помогите.

NB: Я использую ksh88, а не ksh93.

+0

Не знаете 'strtochk', любое определение? –

+0

Какая ошибка плохой замены? – javaPlease42

+0

Примечание: вопрос [Плохая ошибка замещения в 'ksh'] (http: // stackoverflow.com/questions/20962928/bad-substitution-error-in-ksh) является дубликатом этого, и в комментариях упоминалось использование 'ksh88' вместо' ksh93'. –

ответ

2

Синтаксис оболочки очень чувствительны пробельные:

  • [[ является acually название команды, это не только синтаксис, поэтому должен быть пробел после него.
  • Последний аргумент [[ должен быть ]], поэтому ему должно предшествовать пробел.
  • [[ работает по-разному в зависимости от количества аргументов, которые он получает, так что вы хотите иметь пробелы вокруг ==
  • В присваивание переменной, вы не должны иметь пробелы вокруг =.

Советы:

  • как только Вы выясняете это не палиндром, break из цикла в то время как
  • вы, вероятно, проверяя характер по характеру, так что вы хотите ${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 
+0

Привет. Я использую ksh 88. Таким образом, [[$ {strtochk: i: 1} == $ {strtochk: j: 1}]] не работает. Кроме того, rev также не поддерживается. Любые другие альтернативы – Programmer

+0

Возможно, вам придется вернуться к команде ['expr'] (http://man.cx/expr) и ее подкоманде substr –

+0

Можете ли вы изменить свой ответ, чтобы показать, как это сделать. Я действительно застрял здесь – Programmer

1

Вы используете ksh88 но код, который вы пытались использует ksh93 функцию отсутствует для версии 88.

Вы должны заменить

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)) 
Смежные вопросы