Comando Bash read builtin

comando de leitura

Nos sistemas operacionais do tipo Unix, read é um comando interno do shell Bash. Ele lê uma linha de texto da entrada padrão e a divide em palavras. Essas palavras podem ser usadas como entrada para outros comandos.

Descrição

read lê uma única linha da entrada padrão ou do descritor de arquivo fd se a opção -u for usada (consulte -u, abaixo).

Por padrão, a leitura considera um caractere de nova linha como o final de uma linha, mas isso pode ser alterado usando a opção -d.

Após a leitura, a linha é dividida em palavras de acordo com o valor da variável especial de shell IFS, o separador de campo interno. Por padrão, o valor IFS é "espaço, tabulação ou nova linha". Se a leitura encontrar caracteres legíveis antes de encontrar um IFS, ele considerará esses caracteres uma palavra. (Para obter mais informações sobre o IFS, consulte divisão de palavras no bash.)

read atribui a primeira palavra encontrada ao nome, a segunda palavra ao nome2 etc. Se houver mais palavras que nomes, todas as palavras restantes serão atribuídas ao sobrenome especificado. Se apenas um único nome for especificado, a linha inteira será atribuída a essa variável.

Se nenhum nome for especificado, a entrada será armazenada em uma variável chamada REPLY.

Sintaxe

leia [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [nome ... ] [nome2 ...]

Opções

O comando read builtin utiliza as seguintes opções:

-a matriz Armazene as palavras em uma matriz indexada denominada array. A numeração dos elementos da matriz começa em zero.
-d delim Defina o caractere delimitador para delimitar. Este caractere sinaliza o fim da linha. Se -d não for usado, o delimitador de linha padrão é uma nova linha.
-e Obtenha uma linha de entrada de um shell interativo. O usuário insere caracteres manualmente até que o delimitador de linha seja alcançado.
-i texto Quando usado em conjunto com -e (e apenas se -s não for usado), o texto é inserido como o texto inicial da linha de entrada. O usuário tem permissão para editar texto na linha de entrada.
-n nchars Pare de ler depois que um número inteiro nchars caracteres foram lidos, se o delimitador de linha não tiver sido alcançado.
-N nchars Ignore o delimitador de linha. Pare de ler somente depois que os caracteres nchars forem lidos, o EOF for atingido ou o tempo limite da leitura expirar (consulte -t).
prompt -p Imprima o prompt da string, sem uma nova linha, antes de começar a ler.
-r Use "entrada bruta". Especificamente, essa opção faz com que a leitura interprete as barras invertidas literalmente, em vez de interpretá-las como caracteres de escape.
-s Não toque as teclas quando a leitura estiver sendo recebida pelo terminal.
-t timeout Tempo limite e falha de retorno, se uma linha completa de entrada não for lida dentro de segundos de tempo limite. Se o valor do tempo limite for zero, a leitura não lerá nenhum dado, mas retornará êxito se a entrada estiver disponível para leitura. Se o tempo limite não for especificado, o valor da variável do shell TMOUT será usado, se existir. O valor do tempo limite pode ser um número fracionário, por exemplo, 3.5.
-u fd Leia a partir do descritor de arquivo fd em vez da entrada padrão. O descritor de arquivo deve ser um número inteiro pequeno. Para obter informações sobre como abrir um descritor de arquivo personalizado, consulte abrindo descritores de arquivo no bash.

Status de saída

O status de saída da leitura é zero, a menos que o EOF seja encontrado, o tempo limite seja excedido, ocorre um erro ao atribuir um valor ao nome ou o descritor de arquivo fornecido para -u é inválido.

Se um tempo limite for excedido, o status de saída será maior que 128.

Exemplos

enquanto lê; faça eco de "$ REPLY"; feito

read obtém dados do terminal. Digite o que quiser e pressione Enter. O texto é repetido na próxima linha. Esse loop continua até você pressionar Ctrl + D (EOF) em uma nova linha. Como nenhum nome de variável foi especificado, toda a linha de texto é armazenada na variável REPLY.

enquanto lê o texto; faça eco de "$ text"; feito

O mesmo que acima, usando o texto do nome da variável.

enquanto lê -ep "Digite algo:" -i "Meu texto é" texto; faça eco de "$ text"; feito

Fornece um prompt e texto inicial para entrada do usuário. O usuário pode apagar "Meu texto é" ou deixá-lo como parte da entrada. Digitar Ctrl + D em uma nova linha termina o loop.

eco "Olá, mundo!" | (leia; eco "$ REPLY")

A inclusão dos comandos de leitura e eco entre parênteses os executa em um subshell dedicado. Isso permite que a variável REPLY seja acessada por leitura e eco. Para obter mais informações, consulte Ambientes de execução de comandos bash: subshells.

eco "um dois três quatro" | enquanto lê word1 word2 word3; echo "word1: $ word1" echo "word2: $ word2" echo "word3: $ word3" concluído

Faça eco "um dois três quatro" e direcione-o para o loop while, em que read lê a primeira palavra na palavra1, a segunda na palavra2 e tudo o mais na palavra3. Resultado:

palavra1: uma palavra2: duas palavra3: três quatro
eco "um dois três quatro" | enquanto lê -um wordarray; echo $ {wordarray [1]} concluído

O mesmo que acima, mas atribua as palavras aos elementos de uma matriz indexada, matriz de palavras. A numeração começa em zero, então $ {wordarray [1]} retorna a segunda palavra. Para mais informações, consulte matrizes bash. Resultado:

dois
while IFS = ler -r -d $ ' 0' arquivo; faça eco de "$ file" feito <<(find. -print0)

Os comandos acima são a maneira "correta" de usar a localização e a leitura juntas para processar arquivos. É especialmente útil quando você deseja fazer algo em vários arquivos com nomes estranhos ou incomuns. Vamos dar uma olhada em partes específicas do exemplo acima:

enquanto IFS =

IFS = (sem nada após o sinal de igual) define o separador de campo interno como "sem valor". Espaços, guias e novas linhas são, portanto, considerados parte de uma palavra, que preserva o espaço em branco nos nomes dos arquivos.

Observe que o IFS = vem depois de while, garantindo que o IFS seja alterado apenas dentro do loop while. Por exemplo, isso não afetará a localização.

leia -r

O uso da opção -r é necessário para preservar as barras invertidas nos nomes dos arquivos.

-d $ ' 0'

A opção -d define o delimitador de nova linha. Aqui, estamos definindo o caractere NULL, código ASCII zero. (Um zero escapado entre aspas simples, precedido por um cifrão, é interpretado por bash como NULL. Para obter mais informações, consulte Expandindo seqüências de caracteres com escapes interpretados na documentação do bash.)

Estamos usando NULL como delimitador de linha, porque os nomes de arquivo do Linux podem conter novas linhas, portanto, precisamos preservá-las. (Isso soa horrível, mas sim, acontece.)

No entanto, um NULL nunca pode fazer parte de um nome de arquivo Linux, portanto, esse é um delimitador confiável para uso. Felizmente, o find pode usar NULL para delimitar seus resultados, em vez de uma nova linha, se a opção -print0 for especificada:

<<(localizar. -print0)

Aqui, encontre. -print0 cria uma lista de todos os arquivos dentro e abaixo. (o diretório de trabalho) e delimite todos os nomes de arquivos com um NULL. Ao usar -print0, todos os outros argumentos e opções devem precedê-lo, portanto, verifique se é a última parte do comando.

Incluir o comando find em <(...) realiza a substituição do processo: a saída do comando pode ser lida como um arquivo. Por sua vez, essa saída é redirecionada para o loop while usando o primeiro "<".

Para cada iteração do loop while, read lê uma palavra (um único nome de arquivo) e coloca esse valor no arquivo variável, que especificamos como o último argumento do comando read.

Quando não há mais nomes de arquivos para ler, read retorna false, o que aciona o final do loop while e a sequência de comandos termina.

Comandos relacionados

while - Executa um conjunto de ações enquanto uma determinada condição é verdadeira. find - Encontre arquivos dentro de uma hierarquia de diretórios.