Qual seria a melhor maneira de verificar se $ 1 é um número inteiro em / bin / dash?
No bash, eu poderia fazer:
[[ $1 =~ ^([0-9]+)$ ]]
Mas isso não parece ser compatível com POSIX e o traço não suporta esse
shell
regular-expression
string
dash
Martin Vegter
fonte
fonte
foo\n123\nbar
não é um número inteiro, mas passaria nesse teste.Se
dash
,bash
,ksh
,zsh
, POSIXsh
, ouposh
( "uma reimplementação do shell Bourne"sh
); ocase
construto é o mais amplamente disponível e confiável:fonte
dash
? Funciona para mim sob,bash
mas nãodash
.dash
; para interrogar o resultado que adicioneiecho $?
após o comando case.posh
("uma reimplementação do shell Bourne") também não tem problemas com essa solução.case
; um motivo é o bug que você descreve, outro que, nos editores que possuem recursos que dependem de parênteses correspondentes (vim), oferece suporte muito melhor e, não menos importante, acho pessoalmente mais legível tê-los emparelhados. - WRTposh
sendo POSIX; bem, a citação da página de manual que eu sugeri sugeriu outra coisa, mas não se pode confiar em tais declarações informais de qualquer maneira, eu acho. De qualquer forma, a velha casca de bourne não é tão significativa agora que estamos na era POSIX.Você pode usar o
-eq
teste na string, com ela mesma:Se a mensagem de erro for um problema, redirecione a saída de erro para
/dev/null
:fonte
" 023 "
é um número. Observe que ele funciona com traço, mas nem todos os outros shells POSIX, pois o comportamento não é especificado se os operandos forem números inteiros decimais. Por exemplo, com o ksh, diria issoSHLVL
ou1+1
é um número.Tente usá-lo como uma expansão aritmética e veja se funciona. Na verdade, você precisa ser um pouco mais rigoroso do que isso, porque expansões aritméticas ignorariam os espaços iniciais e finais, por exemplo. Faça uma expansão aritmética e verifique se o resultado expandido corresponde exatamente à variável original.
Isso também aceitaria números negativos - se você realmente quiser excluí-los, adicione uma verificação extra
$((${1} >= 0))
.fonte
[[
$(( ... ))
? Nesse caso, minha resposta ainda deve estar materialmente correta, só preciso adicionar algumas citações extras.check_if_number 1.2
e a função retornou:dash: 3: arithmetic expression: expecting EOF: "1.2"
Talvez com
expr
?fonte
match
nem\+
são POSIX. Também diria que 0 não é um número. Você querexpr "x$1" : 'x[0-9]\{1,\}$'
No sistema POSIX, você pode usar expr :
fonte
expr
implementações dirão que 9999999999999999999 não é um número inteiro. O POSIX não oferece garantia de que isso funcionará. Na prática, pelo menos em um sistema GNU, ele dirá que "length" é um número inteiro.expr 9999999999999999999 + 0
me dá um status 3 saída eexpr -12 + 0
eexpr length + 0
me dar um status de saída 0 com GNU expr (+ string
forçasstring
a serem consideradas como uma string com o GNUexpr
.expr "$a" - 0
Funcionaria melhor).-12
é um número inteiro válido, e9999999999999999999
deu um estouro.Aqui está uma função simples usando o mesmo método da resposta do muru :
Exemplo:
Resultado:
fonte