Como eu altero os argumentos do comando ($ 1, $ 2) para números inteiros?

1

Eu tenho vários argumentos ( $1 $2 ) para um script na linha de comando.

Eu estava tentando testá-los, para garantir que os valores inseridos não fossem lixo:

if [ $1 ]; then
    INPUT=$1
if [[ -n ${INPUT//[0-9]/} ]]; then

Ie: Estou tentando garantir que $1 não esteja vazio e composto de 0-9 (dígitos), ou seja, alguém não digitou script string more_strings ou um script simples e não-instrumentado em vez de algo como script 12 321

Mas, em seguida, tentar tratar $INPUT (eu também tentei $ 1) como um inteiro:

if [ $INPUT -gt 100 ]; then
    INPUT=100
fi

Falhou, e através do teste de eco, parece que eu tenho uma string (mesmo que eu usei gt - o que eu pensei que queria avaliá-lo como um inteiro?), e eu não sei como fazer isso / avalia $ 1 como um inteiro?

link

Sugere que eu faça isso:

if [[ $1 != *[!0-9]* ]]; then

Mas eu não entendo o que está acontecendo lá. Não é igual a não 0-9 ??? Por que??

Isso pareceu interessante:

declare -i $1

Mas parece alterar permanentemente $ 1? até ser reatribuído?

Gostaria de saber como testar minhas entradas, para ter certeza de que elas são A) strings ou B) números / inteiros - e, em seguida, como usá-las a partir do meu script (ou como converter eles). De preferência com uma explicação.

Eu tentei fazer algumas buscas de perguntas anteriores, e obviamente estou pesquisando os termos errados - pois isso parece uma coisa muito rudimentar que eu esqueci como fazer / já deveria ter sido respondida em outro lugar.

Não o encontrou aqui:

link

Talvez seja necessário dormir.

    
por user3082 24.04.2018 / 09:37

3 respostas

1

Dentro de [[ .. ]] , o operador = é, na verdade, uma correspondência de padrões, portanto, [[ $1 != *[!0-9]* ]] testa se o valor de $1 não corresponde ao padrão *[!0-9]* .

Os padrões usados aqui são os mesmos para expansão de nome de arquivo, por isso * corresponde a qualquer caractere e [abc] de qualquer caractere entre colchetes e [!abc] ou [^abc] de qualquer caractere não entre parênteses (excluindo a inicial ! ou ^ ). Na verdade, isso testa se $1 contiver algum caractere que não seja um dígito de 0 a 9 .

declare -i var marcaria a variável var como uma variável inteira: atribuições a ela seriam interpretadas como em um contexto aritmético, portanto declare -i a; a=3+5; echo $a; produziria 8 . Mas você não pode usar isso em um parâmetro posicional, como $1 . Em vez disso, declare -i $1 usaria a string contida em $1 e usaria essa como um nome de variável. (Observe que não há $ em declare -i a acima.)

Você não pode usar declare -i para testar se algo é um número, já que as sequências no contexto aritmético são tomadas como variáveis nomes . Isso não é um erro: declare -i a; b=1+2; a=b; echo $a; . Em vez disso, imprime 3 , que pode ou não ser o que você deseja.

    
por 24.04.2018 / 09:46
0

Verificando se há entrada e, em seguida, se for numérico (de 1 ou mais dígitos), usei este glob :

if [ $2 ]; then INPUT=$2 if [[ $INPUT = +([[:digit:]]) ]]; then

Isso parece estar funcionando para testar a entrada não numérica:

if [[ -n ${INPUT//[0-9]/} ]]; then

    
por 24.04.2018 / 19:29
0

Não é uma boa explicação do ilkkachu

Mas você pode tentar dessa maneira

[ ! -z $1 -a $1 -eq $1 ] 2>/dev/null && echo "integer $1" || echo "not integer $1"
    
por 24.04.2018 / 22:20