Objetivo dos dois pontos na expansão variável

Objetivo dos dois pontos na expansão variável

Estou revisando um script de shell antigo. Não consigo entender duas coisas nisso.

rm /data/log || true

value=$(cat /datafile)
if [ ${value: -1} ==  0 ] 
 then echo 'do'
else echo 'dont'
 fi
  1. value: -1- O que isso está realmente fazendo?
  2. rm /data/log || true- O que isso ||trueestá fazendo?

Responder1

${value: -1}se expande para oúltimo personagemdo conteúdo da variável.

${value:-1}édiferentede ${value: -1}!

Referindo-se aExpansão de parâmetros de shellno manual:

  1. ${value:-1}expande para o conteúdo da valuevariável ou, se a variável não estiver definida ou vazia, para a string "1"

  2. ${value: -1}é uma forma abreviada do ${var:offset:length}formulário para extrair uma substring do conteúdo da variável. Um deslocamento -1significa "um caractere do final da string". A :lengthparte está faltando, então a substring é retirada do offsetfinal da string.

    O manual diz:

    Observe que um deslocamento negativo deve ser separado dos dois pontos por pelo menos um espaço para evitar ser confundido com a expansão ':-'.

Responder2

rm /data/log || truesó é (na minha humilde experiência) útil se o script for executado com set -e. set -efaz o shell sair quando um comando sai com um estado de erro. O criador do script aparentemente não estava ciente da -fsinalização para rm.

${value: -1}provavelmente é um erro de digitação. Deveria ser ${value:-1}, fornecendo o padrão (1, não -1; faz -parte da :-sintaxe) para a expansão da variável se valuefor nulo ou não definido.

Se realmente fosse ${value: -1}, veja a resposta de Glenn Jackman para saber o significado real.

Responder3

Do bash(1): ${parameter:-word} Use valores padrão. Se o parâmetro não estiver definido ou for nulo, a expansão da palavra será substituída. Caso contrário, o valor do parâmetro é substituído.

|| truegarante que o comando retorne verdadeiro. ||é um operador OR de curto-circuito, se o comando na frente retornar falso, o comando após ele será executado e o valor de retorno usado.

informação relacionada