Propósito del colon en expansión variable

Sep 24 2020

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
  1. value: -1 - ¿Qué está haciendo esto realmente?
  2. rm /data/log || true- ¿Qué esta ||truehaciendo?

Respuestas

3 LjmDullaart Sep 24 2020 at 07:09

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.

7 glennjackman Sep 24 2020 at 16:27

${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:

  1. ${value:-1}se expande al contenido de la valuevariable, o si la variable no está configurada o está vacía, a la cadena "1"

  2. ${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 la offsetal 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 ': -'.

Henriksupportsthecommunity Sep 24 2020 at 07:02

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.