Propósito de dos puntos en expansión variable

Propósito de dos puntos 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
  1. value: -1- ¿Qué está haciendo esto realmente?
  2. rm /data/log || true- ¿Qué estás ||truehaciendo?

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:

  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 abreviada 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". :lengthFalta la parte, por lo que la subcadena se toma desde offsetel 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 || truesolo (en mi humilde experiencia) es útil si el script se ejecuta con set -e. set -ehace 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 -fbandera 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 valuees 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.

|| truese 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.

información relacionada