
Tengo un script simple que toma 4 variables de la "lectura" del teclado interactivo, sin embargo, mi comando tiene una coma. Leí el valor del separador IFS, pero los ejemplos solo muestran que se lee desde archivos, no desde la entrada del teclado. ¿Existe algún truco para cambiar la entrada o necesito canalizar el comando a través de SED/AWK para que tenga el formato correcto para que lo lea el script?
El script no es nada sofisticado, solo ingresa texto, agrega el valor de entrada y repite las cadenas de comando que se pueden ejecutar con el texto ingresado.
[red] [tarjeta],[puerto] [nombre de host] 0123 0123,A1 ABCDEFG
#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing
echo -e "${green}ping test and ssh into $VAR4${NC}"
Respuesta1
Para tratar una coma como separador de palabras, intente:
IFS="$IFS," read a b c d
Esto agrega temporalmente una coma a IFS
, que es la lista de caracteres que el shell usa para los separadores de campos.
Como ejemplo, recopilemos algunos comentarios:
$ IFS="$IFS," read a b c d
1, 2,3 , 4
Veamos cómo bash interpretó esa entrada:
$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4
Mejora
Podemos combinar el mensaje y el comando de lectura:
IFS="$IFS," read -p "Enter network info: " a b c d
Documentación
De man bash
:
IFS
El separador de campo interno que se utiliza para dividir palabras después de la expansión y para dividir líneas en palabras con el comando incorporado de lectura. El valor predeterminado es<space><tab><newline>
Alternativa
Si, por alguna razón no especificada, uno realmente quisiera utilizar sed
para esta tarea:
read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')
El comando s/,/ /g
le dice a sed que reemplace cada coma con un espacio. q
le dice que salga después de la primera línea.
El solitario <
indicaredirección: le dice al shell que obtenga su entrada para el read
comando del objeto similar a un archivo que sigue a la línea de comando.
La construcción <(...)
se llamasustitución de procesosy crea un objeto similar a un archivo a partir del comando contenido en los pares. Ese comando es el sed
comando que reemplaza las comas con espacios.
Para el mismo enfoque pero usando con awk:
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')