Digamos que eu defini essa função no script:
fct1() {
local msg1=${@}
if [[ "${verb}" = 'tru' ]]; then
echo "I say $msg1"
sleep 1
echo "i repeat"
sleep 1
echo "I saaaaaaaaay $msg1"
else
echo "$msg1"
fi
}
Como eu faria para fazer um usuário chamar essa função de read
?
estou pensando algo como
read fct1 "aha aha ahaaaaa"
E a saída seria:
"I say aha aha ahaaaaa"
"I repeat"
"I saaaaaaaaay aha aha ahaaaaa"
Basicamente, como faço para usar a entrada read
e não armazená-la em uma variável, mas usá-la como um comando?
Obrigado.
Se você quisesse que a mensagem fosse lida como uma linha de stdin (inserida pelo usuário quando o script é usado em um terminal) e depois passada como argumento para a função, você poderia fazer:
line
não é mais um comando padrão, mas ainda bastante difundido. Você pode substituí-lo porhead -n1
, mas com algumas implementações, ele pode ler mais de uma linha (embora produza apenas uma) quando a entrada não estiver vindo de um dispositivo terminal.Com
bash
'sread
você teria que armazená-lo em uma variável. É para isso queread
serve, armazenar entrada em uma variável.Com
zsh
'sread
, você pode usar a-e
opção que ecoa os dados lidos em vez de armazená-los em uma variável, entãoline
acima pode ser escrito comoIFS= read -re
:(isso é menos eficiente do que usar
read
com uma variável, pois precisamos bifurcar um processo para que o zsh possa lerread
a saída de).Claro, você também pode substituir o seu:
com
O
read
utilitário não permite o uso de retornos de chamada (não tenho certeza se nenhuma ferramenta comum do Unix permite). Além disso, não gera os dados que são lidos.O que você teria que fazer é envolver a
read
chamada em uma função que pega o que o usuário está fornecendo e retorna como você descreve. Alternativamente, use alguma outra ferramenta para ler a entrada e produzir a saída desejada, comoawk
.Além disso, em geral, o uso
variable=$@
não é bem definido. Se você quiser os argumentos da linha de comando como uma lista de valores delimitados por espaço, usevariable="$*"
(assumindo o valor padrão daIFS
variável).Este é um pedido bastante incomum ... hmmm ... para obter alguma entrada do terminal na lista de parâmetros posicionais dessa função, tente
Isso continuará
cat
até que você insira um caractere EOF (CTRL-D). Certifique-se de que avert
variável esteja definida comotru
fora da função.