Función de Bash para el [Si/no]

Para los que, como yo, estáis hartos de implementar una y otra vez las preguntas con respuestas si o no en los scripts de bash, os dejo una función fácil de usar:

function yesno () {
	# usage: $(yesno default)
	if [[ $1 == yes ]]
		printf " [Yes/no]: "
		DEFAULT=yes
	else
		printf " [yes/No]: "
		DEFAULT=no
	fi
	while 1 == 1; do
		read RESPONSE
		RESPONSE=$(echo ${RESPONSE,,})
		if [[ $RESPONSE == yes || $RESPONSE == y ]]; then
			printf "yes"
			return 0
		elif [[ $RESPONSE == no || $RESPONSE == n ]]; then
			printf "no"
			return 0
		elif [[ $RESPONSE == "" ]]; then
			printf $DEFAULT
			return 0
		else
			printf "Please respond yes or no: "
	done
}

Una vez ejecutada, solo acepta “yes”, “no” o la tecla ENTER, no hay otra manera de salir del loop. El “yes” y el “no” te lo acepta de cualquier manera, incluso “yEs”. Y la tecla ENTER devuelve la respuesta por defecto.

¿Cómo usarlo?
Por ejemplo queremos hacer algo si la respuesta es yes y queremos que la respuesta por defecto (quizás debería decir por ausencia) sea no:

printf "La pregunta"
if [[ $(yesno no) == yes ]]; then
		#lo que sea que queramos hacer
fi

Lo del [Yes/no] o [yes/No], dependiendo de cual sea la respuesta por defecto, por ausencia, lo imprime la misma función.

No nos ahorramos mucho, de hecho sólo nos ahorramos una línea. Incluso se puede decir que en vez de ahorrarnos unas cuantas líneas (dependiendo de la cantidad de preguntas tipo si/no que tiene nuestro script), tenemos líneas de mas. Pero, ¿qué pasa con los larguísimos scripts de autoconfiguración? Y sobre todo la implementación de la respuesta “por defecto” que en cada caso sería diferente.

Digamos que solo tenemos una pregunta tipo si/no:

printf "Pregunta? [yes/No]: "
read RESPONSE
if [[ $RESPONSE == yes ]]; then
		#lo que sea que queramos hacer
fi

Pero en caso de que la respuesta por defecto sea si:

printf "Pregunta? [Yes/no]: "
read RESPONSE
if [[ $RESPONSE == yes || $RESPONSE == "" ]]; then
		#lo que sea que queramos hacer
fi

¿Y que pasa si queremos hacer cosas tanto para el si como para el no? Los dos casos quedarían de la manera:

printf "Pregunta? [yes/No]: "
read RESPONSE
if [[ $RESPONSE == yes ]]; then
		#lo que sea que queramos hacer
else
		#la otra cosa por hacer
fi

 

printf "Pregunta? [Yes/no]: "
read RESPONSE
if [[ $RESPONSE == yes || $RESPONSE == "" ]]; then
		#lo que sea que queramos hacer
else
		#la otra cosa por hacer
fi

Ya se van complicando las cosas.

Anuncios

2 pensamientos en “Función de Bash para el [Si/no]

  1. Interesante 🙂 pero en lo personal… Utilizaría select

    select choice in yes no; do
      echo "you $choice"
    done

    Y para agregar alguna acción haría algo como:

    PS3="¿En que país vives?
    select choice in japon italia chile; do
      case $choice in
        japon) echo "Tu selección esta en Asía" ;;
        italia) echo "Tu selección esta en Europa" ;;
        chile) echo "Tu selección esta en América" ;;
      esac
    done
  2. Supongo que case es más óptimo que if + elif + elif, no tiene que evaluar tantas condiciones en caso de que sea la última y por tanto sería más óptimo. Aunque no soy muy fan de case salvo que sea para dar un menú. Será cuestión de gustos.

    En cuanto a select, no se que decirte, se podría hacer, pero no me convence mucho. También supongo que depende de la persona y del momento en el que se le ocurre hacer algo, la primera idea que funciona es la buena, aunque no sea la más óptima.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s