Código:
#!/bin/bash
declare -i number
# The script will treat subsequent occurrences of "number" as an integer.
number=3
echo "Number = $number" # Number = 3
number=three
echo "Number = $number" # Number = 0
# Tries to evaluate the string "three" as an integer.
No puedo entender por qué number
cambiado cuando asigno una cadena "three"
a number
. Yo creo que number
Debería permanecer igual. Eso realmente me sorprendió.
Respuestas
2 para la respuesta № 1Desde el declare
Sección de man bash
:
-i The variable is treated as an integer; arithmetic evaluation (see ARITHMETIC EVALUATION) is performed when the variable is assigned a value.
Desde el ARITHMETIC EVALUATION
Sección de man bash
:
The value of a variable is evaluated as an arithmetic expression when...a variable which has been given the integer attribute using declare -i is assigned a value. A null value evaluates to 0.
Juntos, estos establecen claramente que el comportamiento que usted está viendo es el comportamiento esperado. Cuando los personajes t
h
r
e
e
Se evalúan aritméticamente, los resultados resultantes. null
valor se evalúa como 0
, que luego se asigna a la variable number
.
Todas las asignaciones en bash se interpretan primero como cadenas. number=10
interpreta el 1
0
como cadena primero, lo reconoce como un entero válido y lo deja como está. number=three
es tan sintácticamente y semánticamente válido como number=10
, por lo que su script continúa sin ningún error después de asignar el valor evaluado de 0
a number
.