Existem duas maneiras principais de capturar a saída de um comando em um script de shell: substituição de comando e o read
embutido.
A maneira simples de dividir a saída em palavras é basear-se no recurso de divisão integrado do shell e colocar a saída em uma matriz:
words=($(echo "X and Y are friends"))
echo "The ${words[5]} are ${words[1]} and ${words[3]}"
Isso funciona em shells com arrays: ksh93¹, mksh, bash, zsh. Em outros shells, você não pode armazenar uma lista de palavras, exceto nos parâmetros posicionais.
set -- $(echo "X and Y are friends")
echo "The $5 are $1 and $3"
Na verdade, cada palavra na saída é tratada como um padrão de caractere curinga e substituída pela lista de arquivos correspondentes, se houver. (Exceto em zsh, que só faz isso quando explicitamente instruído, a menos que no modo de compatibilidade sh.) Por exemplo, se uma das palavras for *
, ela será substituída pela lista de arquivos no diretório atual. Para evitar isso, desative a correspondência de curingas:
set -f
words=($(echo "* and / are punctuation"))
echo "Here's some ${words[5]}: ${words[1]} and ${words[3]}"
set +f
Com read
, você pode atribuir palavras individuais a uma variável cada. A parte complicada sobre read
é que, uma vez que lê a entrada padrão, ela é freqüentemente usada como o lado direito em um tubo; mas na maioria das shells (exceção de ATT ksh e zsh), ambos os lados de um pipe são executados em uma subshell, então as atribuições de variáveis são perdidas fora do pipe. Você pode colocar read
como parte de uma sequência de instruções.
echo "X and Y are friends" | {
read -r first conjunction second verb complement remainder
echo "The $complement are $first and $second"
}
Como alternativa, em ksh93, bash ou zsh, você pode passar a entrada em um substituição de processos .
read -r first conjunction second verb complement remainder <(echo "X and Y are friends")
echo "The $complement are $first and $second"
Se você quiser armazenar as palavras em uma matriz, poderá usar read -rA words
em mksh, ksh93 e zsh ou read -ra words
no bash, por exemplo, em bash
read -ra words <(echo "X and Y are friends")
é equivalente a
set -f; words=$((echo "X and Y are friends")); set +f
se o comando gerar uma única linha, exceto que não redefine a opção -f
se estiver ativada antes.
¹ O Ksh88 possui matrizes, mas a atribuição usa uma sintaxe diferente.