linha de comando do shell, entrada de linha, mudança de vírgula para espaço

linha de comando do shell, entrada de linha, mudança de vírgula para espaço

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 sedesta tarefa:

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

O comando s/,/ /gdiz ao sed para substituir cada vírgula por um espaço. qdiz para sair após a primeira linha.

O solitário <indicaredirecionamento: diz ao shell para obter sua entrada para o readcomando 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 sedcomando 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}')

informação relacionada