script quimica que moneda comando canada shell unix scripting ksh

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++ y j-- 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