No shell script como usar o read in echo

0
echo "my name is='read' and am from 'read'"

resultado esperado:

my name is=sudhir and am from india

valores sudhir e india são entradas de uso.

Como conseguir isso, eu gosto de aplicar isso em 480 perguntas. Não sei o número de entradas do usuário necessárias para cada questão. por favor ajude.

    
por sudhir tataraju 20.12.2017 / 07:16

1 resposta

5

read , por padrão, lê palavras de sua entrada em variáveis .

'cmd' , a forma antiga de $(...) captura a saída de um comando. Por padrão, read não produz saída. O texto que você vê quando digita algo para ser lido por read é o echo do dispositivo terminal, não é emitido por read ¹.

Algumas implementações read podem produzir o que lêem. Por exemplo, zsh ' read builtin pode fazer isso com -e ou -E (este último também armazena a entrada em variáveis além de ecoar de volta).

Então, em zsh :

echo "my name is=$(read -e) and am from $(read -e)"

Portavelmente, você pode ler uma linha de entrada (em oposição a o comportamento de leitura especial de read ) e enviá-la de volta com head -n1 . No entanto, observe que, se a entrada padrão não for um dispositivo de terminal ou um arquivo pesquisável, a maioria das implementações de head lerá mais de uma linha.

Muitos sistemas ainda têm um comando line para isso (costumava ser padrão, mais tarde depreciado).

echo "my name is=$(line) and am from $(line)"

Que deve ler um byte de cada vez, portanto, não leia mais de uma linha de entrada.

Se não estiver disponível, você pode sempre emular esse line com read :

line() {
  IFS= read -r line
  ret=$?
  printf '%s\n' "$line" || return "$ret"
}

Ou até mesmo torná-lo

prompt() {
  printf >&2 %s "$1"
  IFS= read -r answer
  printf '%s\n' "$answer"
}

printf '%s\n' "my name is=$(
  prompt "What is your name? ") and am from $(
  prompt "Where are you from? ")"

(usando aqui printf em vez de echo como echo geralmente não pode ser usado para dados arbitrários ).

(o mesmo que zsh ' IFS= read -re '?What is your name? ' ).

Para completar, com csh ou tcsh , você pode fazer:

printf '%s\n' "my name is=$< and am from $<"

$< sendo o caminho do csh para ler a entrada em uma variável.

Se você quisesse repetir isso para cada duas linhas de entrada, seria melhor usar um utilitário de processamento de texto como awk :

awk '{name=$0; getline place; print "my name is="name" and am from "place}'

¹ a menos que read esteja configurado para implementar um editor de linhas sozinho, como com read -e in bash ou definindo a opção emacs , gmacs ou vi em ksh93 (e stdin is um dispositivo de terminal), mas read produziria o echo no stderr, não o stdout.

    
por 20.12.2017 / 08:07