Propósito del colon en expansión variable
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é esta||truehaciendo?
Respuestas
rm /data/log || truesolo es (en mi humilde experiencia) útil si el script se ejecuta con set -e. set -ehace que el shell salga cuando un comando sale con un estado de error. El creador del guión aparentemente no estaba al tanto de la -fbandera de rm.
${value: -1}probablemente sea un error tipográfico. Debería serlo ${value:-1}, proporcionando el valor predeterminado (1, no -1; -es parte de la :-sintaxis) para la expansión de la variable si valuees nula o no está establecida.
Si realmente debería serlo ${value: -1}, consulte la respuesta de Glenn Jackman para conocer el significado real.
${value: -1}se expande hasta el último carácter del contenido de la variable.
${value:-1}es diferente de ${value: -1}!
Refiriéndose a Expansión de parámetros de Shell en el manual:
${value:-1}se expande al contenido de lavaluevariable, o si la variable no está configurada o está vacía, a la cadena "1"${value: -1}es una forma corta del${var:offset:length}formulario para extraer una subcadena del contenido de la variable. Un desplazamiento de-1significa "un carácter desde el final de la cadena". La:lengthparte que falta, por lo que la subcadena se toma de laoffsetal 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 confundirse con la expansión ': -'.
Desde bash (1): $ {parámetro: -word} Usar valores predeterminados. Si el parámetro no está configurado o es nulo, se sustituye la expansión de palabra. De lo contrario, se sustituye el valor del parámetro.
|| truese asegura de que el comando devuelva verdadero. ||es un operador OR de cortocircuito, si el comando anterior devuelve falso, el comando posterior se ejecuta y se utiliza el valor de retorno.