Tengo el siguiente código ksh simple:
MY_LIST=first,second,third
NUM_IN_LIST=` echo $MY_LIST | sed s"/,/ /g" | wc -w `
print $NUM_IN_LIST
3
[[ $NUM_IN_LIST = 3 ]] && print match
but I dont get the match print -:(
tal vez porque algunos espacios?
¿Puedo recibir alguna otra sugerencia para contar e imprimir las palabras en $MY_LIST? (después de quitar el separador ",")
Respuesta1
Tu ejemplo funciona para mí.
Aquí tienes una alternativa:
MY_LIST=first,second,third
saveIFS=$IFS
IFS=','
array=($MY_LIST)
IFS=$saveIFS
NUM_IN_LIST=${#array[@]}
print $NUM_IN_LIST
[[ $NUM_IN_LIST = 3 ]] && print match
Respuesta2
Su código debería funcionar, pero sólo si $MY_LIST
no contiene ninguno de los diversos caracteres especiales:
echo $MY_LIST
debería serprintf %s "$MY_LIST"
oprint -r -- "$MY_LIST"
. La falta de comillas le indica al shell que expanda los caracteres globales\\*?[
. También le dice al shell que divida palabras en espacios, aunque eso no importaría aquí excepto por el siguiente problema.- El uso
echo
también provoca la interpretación de barras invertidas y un interlineado-
en algunas circunstancias. - `sed s"/,/ /g" crea comas y espacios como separadores de palabras.
Un problema adicional que explica por qué la prueba final no funciona es que wc -w
produce resultados con espacios iniciales, que se capturan en archivos $NUM_IN_LIST
. print $NUM_IN_LIST
realiza división de palabras $NUM_IN_LIST
, por lo que termina simplemente imprimiendo los dígitos; hacer print "$NUM_IN_LIST"
para ver la diferencia. La [[ … ]]
construcción inhibe la división de palabras y =
es un operador de comparación de cadenas, por lo que se le ha dicho correctamente que ' 3'
no es lo mismo que '3'
. [[ $NUM_IN_LIST -eq 3 ]]
o [ $NUM_IN_LIST = 3 ]
hubiera sido cierto (pero ninguna de las dos es una solución real, son solo soluciones limitadas).
Una forma puramente ksh de mostrar el número de campos separados por comas es
commas=${MY_LIST//[!,]/}
NUM_IN_LIST=${#commas}
Si alguien necesita una solución POSIX sh, reemplace la primera línea por commas=$(printf %s "$MY_LIST" | tr -dc ,)
.