¿Cuál sería la mejor manera de verificar si $ 1 es un entero en / bin / dash?
En bash, podría hacer:
[[ $1 =~ ^([0-9]+)$ ]]
Pero eso no parece ser compatible con POSIX y el guión no es compatible con eso
shell
regular-expression
string
dash
Martin Vegter
fuente
fuente
foo\n123\nbar
no es un entero, pero pasaría esta prueba.Ya sea
dash
,bash
,ksh
,zsh
, POSIXsh
, oposh
( "una reimplementación de la shell Bourne"sh
); Elcase
constructo es el más ampliamente disponible y confiable:fuente
dash
? Funciona para mí debajobash
pero nodash
.dash
; para interrogar el resultado que agreguéecho $?
después del comando del caso.posh
("una reimplementación del shell Bourne") tampoco tiene ningún problema con esa solución.case
; Una de las razones es el error que usted describe, otra que en los editores que tienen características que se basan en paréntesis coincidentes (vim) brinda un soporte mucho mejor, y no menos importante personalmente me parece más legible hacer que coincidan. - WRTposh
siendo POSIX; bueno, la cita de la página de manual que di sugirió algo más, pero supongo que no se puede confiar en declaraciones tan informales de todos modos. El viejo caparazón de bourne ya no es tan significativo ahora que estamos en la era POSIX.Puede usar la
-eq
prueba en la cadena, consigo misma:Si el mensaje de error es un problema, redirija la salida del error a
/dev/null
:fuente
" 023 "
es un número. Tenga en cuenta que funciona con guiones, pero no todos los demás shells POSIX ya que el comportamiento no se especifica si los operandos son enteros decimales de nota. Por ejemplo con ksh, diría queSHLVL
o1+1
es un número.Intente usarlo como una expansión aritmética y vea si funciona. En realidad, debe ser un poco más estricto que eso, porque las expansiones aritméticas ignorarían los espacios iniciales y finales, por ejemplo. Realice una expansión aritmética y asegúrese de que el resultado expandido coincida exactamente con la variable original.
Esto también aceptaría números negativos: si realmente quiere excluirlos, agregue un cheque adicional para
$((${1} >= 0))
.fuente
[[
$(( ... ))
? Si es así, mi respuesta aún debería ser materialmente correcta, solo necesito agregar algunas citas adicionales.check_if_number 1.2
y la función volvió:dash: 3: arithmetic expression: expecting EOF: "1.2"
Quizás con
expr
?fuente
match
tampoco\+
son POSIX. También diría que 0 no es un número. Tú quieresexpr "x$1" : 'x[0-9]\{1,\}$'
En el sistema POSIX, puede usar expr :
fuente
expr
implementaciones dirán que 9999999999999999999 no es un número entero. POSIX no garantiza que esto funcione. En la práctica, al menos en un sistema GNU, dirá que "longitud" es un número entero.expr 9999999999999999999 + 0
me da un estado de salida 3expr -12 + 0
yexpr length + 0
me da un estado de salida 0 con GNU expr (+ string
obligastring
a ser considerado como una cadena con GNUexpr
.expr "$a" - 0
Funcionaría mejor).-12
es un número entero válido, y9999999999999999999
dio un desbordamiento.Aquí hay una función simple que usa el mismo método que la respuesta de muru :
Ejemplo:
Salida:
fuente