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
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"
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
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...
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)"
Tags command-line bash scripts