linha de comando shell input linechange vírgula ao espaço

1

Eu tenho um script simples que pega 4 variáveis do teclado interativo 'read', entretanto meu comando tem uma vírgula. Eu li sobre o valor do separador IFS, mas os exemplos mostram apenas a leitura de arquivos não entrada de teclado. Existe algum truque para alterar a entrada, ou eu preciso canalizar o comando através do SED / AWK para que seja o formato correto para o script ler?

O script não é nada extravagante, apenas insere texto e adiciona o valor de entrada e as sequências de comando echos back que podem ser executadas com o texto digitado.

[rede] [cartão], [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}"
    
por Lethal Gimmick 04.09.2016 / 21:52

1 resposta

1

Para tratar uma vírgula como um 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 campo.

Como exemplo, vamos reunir alguma entrada:

$ 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 :

IFS
The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is <space><tab><newline>

Alternativa

Se, por alguma razão não especificada, alguém realmente quisesse usar sed para essa tarefa:

read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')

O comando s/,/ /g informa ao sed para substituir cada vírgula por um espaço. q diz para sair depois da primeira linha.

O lone < indica redirecionamento : ele diz ao shell para obter sua entrada para o comando read do objeto tipo arquivo que segue na linha de comando.

A construção <(...) é chamada de substituição de processo e cria um objeto semelhante a um arquivo a partir do comando contido nos parênteses. Esse comando é o comando sed que substitui vírgulas por espaços.

Para a mesma abordagem, mas usando o awk:

read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')
    
por 04.09.2016 / 22:06