Comando Bash read builtin
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 .)
GorjetaPara preservar o espaço em branco no início ou no final de uma linha, é comum especificar IFS = (sem valor) imediatamente antes do comando de leitura . Após a leitura, o IFS retorna ao seu valor anterior. Para mais informações, veja os exemplos abaixo.
Leia atribui a primeira palavra que encontra para nomear , a segunda palavra para nome2 , etc. Se houver mais palavras do que nomes, todas as palavras restantes são atribuídos ao último nome 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
The exit status of read is zero unless EOF is encountered, the timeout is exceeded, an error occurs assigning a value to name, or the file descriptor provided to -u is invalid.
If a timeout is exceeded, the exit status is greater than 128.
Examples
while read; do echo "$REPLY"; done
read takes data from the terminal. Type whatever you’d like, and press Enter. The text is echoed on the next line. This loop continues until you press Ctrl+D (EOF) on a new line. Because no variable names were specified, the entire line of text is stored in the variable REPLY.
while read text; do echo "$text"; done
Same as above, using the variable name text.
while read -ep "Type something: " -i "My text is " text; do echo "$text"; done
Provides a prompt, and initial text for user input. The user can erase “My text is “, or leave it as part of the input. Typing Ctrl+D on a new line terminates the loop.
echo "Hello, world!" | (read; echo "$REPLY")
Enclosing the read and echo commands in parentheses executes them in a dedicated subshell. This allows the REPLY variable to be accessed by both read and echo. For more information, see bash command execution environments: subshells.
echo "one two three four" | while read word1 word2 word3; do echo "word1: $word1" echo "word2: $word2" echo "word3: $word3" done
Echo “one two three four” and pipe it to the while loop, where read reads the first word into word1, the second into word2, and everything else into word3. Output:
word1: one word2: two word3: three four
echo "one two three four" | while read -a wordarray; do echo ${wordarray[1]} done
Same as above, but assign the words to the elements of an indexed array, wordarray. The numbering starts at zero, so ${wordarray[1]} returns the second word. For more information, see bash arrays. Output:
two
while IFS= read -r -d $'\0' file; do echo "$file" done < <(find . -print0)
The above commands are the “proper” way to use find and read together to process files. It’s especially useful when you want to do something to a lot of files that have odd or unusual names. Let’s take a look at specific parts of the above example:
while IFS=
IFS= (with nothing after the equals sign) sets the internal field separator to “no value”. Spaces, tabs, and newlines are therefore considered part of a word, which preserves white space in the file names.
Note that IFS= comes after while, ensuring that IFS is altered only inside the while loop. For instance, it won’t affect find.
read -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, esta saída é redirecionada para o enquanto loop usando o primeiro ” < “.
Para cada iteração da enquanto loop, leia lê uma palavra (um único nome do arquivo) e coloca esse valor na variável de arquivo , que nós especificado como o último argumento da leitura de comando.
Quando não há mais nomes de arquivos para ler, ler retornos falsos, o que desencadeia o fim da enquanto loop, 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.