Bourne shell: trailing '-' operator na substituição de parâmetros

1

Estou lendo um script de shell para adicionar uma barra de progresso a determinados processos (encontrado aqui ). Estou tendo problemas para entender essa linha (opcional):

#BAR_EXT=${BAR_EXT-}

O comentário diz que isso adicionará uma extensão a cada arquivo, e talvez eu precise ler mais, mas não estou familiarizado com o uso do - operador.

Eu sei sobre esse tipo de substituição, conforme encontrado no Manual de referência do bash :

${parameter:-word}

Eu também sei que o acima irá substituir um valor nulo por parameter com word , enquanto ${parameter-word} não. (Pelo menos, acho que sei disso.)

Mas com nada especificado após o - aqui, não sei o que está acontecendo. Isso simplesmente substituirá parameter por um valor nulo? Geralmente, eu aceito isso como uma suposição de trabalho e apenas continuo lendo, mas com o comentário mencionando extensões adicionando aos arquivos.

    
por wubzy 22.03.2015 / 22:24

3 respostas

2

O script contém o comando set -u ? Isso significa

Treat unset variables and parameters other than the special parameters "@" and "*" as an error when performing parameter expansion.  If expansion is attempted on an unset variable or parameter, the shell prints an error message, and, if not interactive, exits with a non-zero status.

Em outras palavras, se $BAR_EXT não estiver definido, algo como

BAR_FILE="$BAR_FILE$BAR_EXT"

falharia. O comando

BAR_EXT=${BAR_EXT-}

definirá explicitamente $BAR_EXT como uma string vazia se não estiver definido, evitando assim esse erro.

    
por 22.03.2015 / 22:50
1

${VARIABLE-} expande para o valor de VARIABLE , se estiver definido, e para a sequência vazia, caso contrário. Este é geralmente o que o $VARIABLE faz. No entanto, quando a opção set -u ( set -o nounset ) estiver ativada, $VARIABLE dispara um erro quando a variável não é definida, enquanto ${VARIABLE-} ainda produz uma string vazia. Então, ${VARIABLE-} significa “Eu pretendia que isso resultasse em uma string vazia mesmo se a variável não fosse definida”, enquanto $VARIABLE poderia significar isso ou poderia significar “Eu pretendia que a variável fosse definida”.

    
por 22.03.2015 / 23:07
-2

Verifique a página man do recente Bourne Shell:

link

e procure a seção "Substituição de Parâmetros", isso está na página 8. Duas páginas abaixo, há uma tabela que explica todas as expansões possíveis.

O Bourne Shell suporta muito mais do que apenas '-' na substituição de parâmetros.

    
por 18.08.2015 / 14:51