Como verificar o número de campos dados ao comando 'read'?

4

Eu tenho uma pergunta rápida relacionada a $# nos scripts de shell.

Portanto, posso usar $# na linha de comando para verificar o número de argumentos de um shell script fornecidos pelo usuário.

Exemplo:

#  ./shellScript varONE varTWO
#  $#
>  2  <--  so output 2 here reflects varONE and varTWO

Algum comando que eu possa usar para o comando read ?

Por exemplo:

#!/bin/bash
read -p "please input value" var1 var2
echo $#  <--  however here will return 0 even user input two values at command line

Algum outro comando que eu possa usar aqui para retornar 2 para que eu possa verificar as variáveis de entrada do usuário? Como:

[ $# -lt 2 ] && echo "failed"
    
por user195661 21.04.2014 / 20:05

3 respostas

4

A melhor maneira de verificar se você recebeu um valor em varTWO é verificar se varTWO está vazio da seguinte forma:

read varONE varTWO
if [[ $varTWO = '' ]]; then
    echo "failed"
fi
    
por jobin 21.04.2014 / 20:14
0

A variável especial Shell $# retorna o número de argumentos posicionais atribuídos a essa invocação do shell.

se você quiser que os argumentos passados para o script sejam exatamente 2:

if [ $# -ne 2 ]; then
    echo "failed" 
fi

#check if args are correct here...
    
por girardengo 21.04.2014 / 20:41
0

A resposta curta é que você não pode. Você precisa dizer a read quantos argumentos deve esperar, só lerá o quanto você quiser. Se você der apenas um nome de variável, ele irá ler tudo nessa variável. Se você der mais de um, por exemplo 3, ele lerá tudo até o primeiro espaço (ou tabulação, ou nova linha ou qualquer outra coisa que você tenha definido em $IFS ) no 1º, tudo para o próximo no segundo e o resto da linha para o terceiro. Para ilustrar:

$ cat file
one two three four five
$ while read line; do echo "$line"; done < file
one two three four five
$ while read first second rest; do echo "First: $first, Second:$second Rest:$rest"; done < file
First: one, Second:two Rest:three four five

Portanto, read lerá quantas variáveis você fornecer. Se você pode ter uma entrada de tamanho variável, você precisará testar cada um para descobrir quantos foram passados, como explicado na resposta <@ do Jobim. a>, ou você pode usar matrizes.

Como explicado em help read :

  

Opções:

     

-a array atribui as palavras lidas a índices sequenciais do array               variável ARRAY, começando em zero

Isso significa que você pode armazenar os valores de entrada em uma matriz e, em seguida, obter o comprimento da matriz com ${#ArrayName[@]} :

#!/usr/bin/env bash

read -a values -p "please input values: " 
echo "You gave ${#values[@]} value(s)"
    
por terdon 23.04.2014 / 03:03