Questão Como verificar o número de campos dados ao comando `read`?


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

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

Exemplo:

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

Qualquer comando que eu possa usar para read comando?

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

Existe algum outro comando que eu possa usar aqui para retornar 2 para que eu possa verificar as variáveis ​​de entrada do usuário? Gostar:

[ $# -lt 2 ] && echo "failed"

4
2018-04-21 18:05


origem


Alguma das respostas foi útil? - jobin


Respostas:


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

read varONE varTWO
if [[ $varTWO = '' ]]; then
    echo "failed"
fi

4
2018-04-21 18:14



UAU, MUITO OBRIGADO!!!! - user195661
não é a primeira verificação no se obsoleto? (como varONE pode ser '' se varTWO não é?) - Rinzwind
@Rinzwind: varONE pode ser '' quando nenhum argumento foi fornecido e varTWO pode ser '' quando apenas um argumento é fornecido. - jobin
@Rinzwind: Ah sim, não tenho certeza do que eu estava pensando enquanto escrevi isso: / - jobin


Variável especial Shell $# retorna o número de argumentos posicionais dados a esta 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...

0
2018-04-21 18:41



Como isso responde a pergunta? - jobin
verifique se o número de argumentos, não há necessidade de verificar se eles são nulos. A passagem de argumentos é posicional, portanto, se você tem 2, é necessariamente válido. - girardengo


A resposta curta é que você não pode. Você precisa dizer read quantos argumentos ele deve esperar, só lerá tanto quanto você disser. Se você der apenas um nome de variável, ele irá ler tudo para essa 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. 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

Assim, read lerá quantas variáveis ​​você der. Se você pode ter uma entrada de comprimento variável, você precisará testar cada um para descobrir quantos foram passados, como explicado no @ Jobim's respondaou você pode usar matrizes.

Como explicado em help read:

Opções:

-a matriz atribui as palavras lidas a índices sequenciais da matriz               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)"

0
2018-04-23 01:03