¿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\nbarno es un entero, pero pasaría esta prueba.Ya sea
dash,bash,ksh,zsh, POSIXsh, oposh( "una reimplementación de la shell Bourne"sh); Elcaseconstructo es el más ampliamente disponible y confiable:fuente
dash? Funciona para mí debajobashpero 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. - WRTposhsiendo 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
-eqprueba 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 queSHLVLo1+1es 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.2y la función volvió:dash: 3: arithmetic expression: expecting EOF: "1.2"Quizás con
expr?fuente
matchtampoco\+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
exprimplementaciones 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 + 0me da un estado de salida 3expr -12 + 0yexpr length + 0me da un estado de salida 0 con GNU expr (+ stringobligastringa ser considerado como una cadena con GNUexpr.expr "$a" - 0Funcionaría mejor).-12es un número entero válido, y9999999999999999999dio un desbordamiento.Aquí hay una función simple que usa el mismo método que la respuesta de muru :
Ejemplo:
Salida:
fuente