
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
value: -1
- O que isso está realmente fazendo?rm /data/log || true
- O que isso||true
está 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:
${value:-1}
expande para o conteúdo davalue
variável ou, se a variável não estiver definida ou vazia, para a string "1"${value: -1}
é uma forma abreviada do${var:offset:length}
formulário para extrair uma substring do conteúdo da variável. Um deslocamento-1
significa "um caractere do final da string". A:length
parte está faltando, então a substring é retirada dooffset
final 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 || true
só é (na minha humilde experiência) útil se o script for executado com set -e
. set -e
faz o shell sair quando um comando sai com um estado de erro. O criador do script aparentemente não estava ciente da -f
sinalizaçã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 value
for 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.
|| true
garante 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.