
Eu tenho um script simples que usa 4 variáveis do teclado interativo 'leitura', porém meu comando contém uma vírgula. Eu li o valor do separador IFS, mas os exemplos mostram apenas a leitura de arquivos e não de entrada do teclado. Existe um truque para alterar a entrada ou preciso canalizar o comando por meio do SED/AWK para ter o formato correto de leitura do script?
O script não é nada sofisticado, apenas insere texto e adiciona o valor de entrada e ecoa strings de comando que podem ser executadas com o texto inserido.
[rede] [placa],[porta] [nome do 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}"
Responder1
Para tratar uma vírgula como separador de palavras, tente:
IFS="$IFS," read a b c d
Isso adiciona temporariamente uma vírgula a IFS
, que é a lista de caracteres que o shell usa para separadores de campos.
Como exemplo, vamos reunir algumas informações:
$ IFS="$IFS," read a b c d
1, 2,3 , 4
Vamos ver como o bash interpretou essa entrada:
$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4
Melhoria
Podemos combinar o prompt e o comando de leitura:
IFS="$IFS," read -p "Enter network info: " a b c d
Documentação
De man bash
:
SE
O separador de campo interno que é usado para divisão de palavras após a expansão e para dividir linhas em palavras com o comando read builtin. o valor padrão é<space><tab><newline>
Alternativa
Se, por algum motivo não especificado, alguém realmente quisesse usar sed
esta tarefa:
read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')
O comando s/,/ /g
diz ao sed para substituir cada vírgula por um espaço. q
diz para sair após a primeira linha.
O solitário <
indicaredirecionamento: diz ao shell para obter sua entrada para o read
comando do objeto semelhante a um arquivo que segue na linha de comando.
A construção <(...)
é chamadasubstituição de processoe cria um objeto semelhante a um arquivo a partir do comando contido nos parênteses. Esse comando é o sed
comando que substitui vírgulas por espaços.
Para a mesma abordagem, mas usando com awk:
read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')