
Estoy revisando un antiguo script de shell. No puedo entender dos cosas en él.
rm /data/log || true
value=$(cat /datafile)
if [ ${value: -1} == 0 ]
then echo 'do'
else echo 'dont'
fi
value: -1
- ¿Qué está haciendo esto realmente?rm /data/log || true
- ¿Qué estás||true
haciendo?
Respuesta1
${value: -1}
se expande a laúltimo personajede los contenidos variables.
${value:-1}
esdiferentede ${value: -1}
!
Refiriéndose aExpansión de parámetros de Shellen el manual:
${value:-1}
se expande al contenido de lavalue
variable, o si la variable no está configurada o está vacía, a la cadena "1"${value: -1}
es una forma abreviada del${var:offset:length}
formulario para extraer una subcadena del contenido de la variable. Un desplazamiento de-1
significa "un carácter desde el final de la cadena".:length
Falta la parte, por lo que la subcadena se toma desdeoffset
el final de la cadena.El manual dice:
Tenga en cuenta que un desplazamiento negativo debe estar separado de los dos puntos por al menos un espacio para evitar que se confunda con la expansión ':-'.
Respuesta2
rm /data/log || true
solo (en mi humilde experiencia) es útil si el script se ejecuta con set -e
. set -e
hace que el shell salga cuando un comando sale con un estado de error. Al parecer, el creador del guión no estaba al tanto de la -f
bandera de rm
.
${value: -1}
Probablemente sea un error tipográfico. Debería ser ${value:-1}
, proporcionando el valor predeterminado (1, no -1; es -
parte de la :-
sintaxis) para la expansión de la variable si value
es nula o no está configurada.
Si realmente debería serlo ${value: -1}
, consulte la respuesta de Glenn Jackman para conocer el significado real.
Respuesta3
Desde bash(1): ${parámetro:-palabra} Utilice valores predeterminados. Si el parámetro no está establecido o es nulo, se sustituye la expansión de la palabra. De lo contrario, se sustituye el valor del parámetro.
|| true
se asegura de que el comando devuelva verdadero. ||
es un operador OR de cortocircuito, si el comando anterior devuelve falso, se ejecuta el comando posterior y se utiliza el valor de retorno.