shell - quimica - No se puede depurar el programa simple de ksh
ksh vs bash (2)
Escribí este código de muestra KornShell (ksh) pero está obteniendo un error de sustitución incorrecto durante la cláusula if.
while ((i < $halflen))
do
if [[${strtochk:i:i}==${strtochk:j:j}]];then
i++
j--
else
ispalindrome = false
fi
done
Por favor ayuda.
NB: Estoy usando ksh88
, no ksh93
.
Está utilizando ksh88
pero el código que intentó utilizar es la característica ksh93
falta para la versión 88.
Debes reemplazar
if [[${strtochk:i:i}==${strtochk:j:j}]];then
con estas líneas portátiles:
if [ "$(printf "%s" "$strtochk" | cut -c $i)" =
"$(printf "%s" "$strtochk" | cut -c $j)" ]; then
y lo incorrecto
i++
j--
con:
i=$((i+1))
j=$((j-1))
la sintaxis del shell es muy sensible al espacio en blanco:
-
[[
es el nombre de un comando, no es solo sintaxis, por lo que debe haber un espacio después de él). - El último argumento de
[[
debe ser]]
, por lo que debe ir precedido de un espacio. -
[[
funciona de manera diferente según la cantidad de argumentos que recibe, por lo que quieres tener espacios alrededor==
- En una asignación de variable, no debe tener espacios alrededor de
=
.
Consejos:
- una vez que descubras que no es un palíndromo, sal del ciclo while
- probablemente esté revisando carácter por personaje, por lo que quiere
${strtochk:i:1}
-
i++
yj--
son expresiones aritméticas, no comandos, por lo que necesita el doble paréntesis. - ¿Estás empezando con
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
Compruebe si su sistema tiene rev
, entonces simplemente puede hacer:
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