Por que as aspas duplas e backquotes em um script de shell?

5

Estou vendo este script script de backup mysql e eu don ' Não entendo qual é a razão para usar ambos os backticks e aspas duplas em torno dos nomes dos comandos?

379 WHICH="'which which'"
380 AWK="'${WHICH} gawk'"
381 LOGGER="'${WHICH} logger'"
382 ECHO="'${WHICH} echo'"
383 CAT="'${WHICH} cat'"
384 BASENAME="'${WHICH} basename'"
385 DATEC="'${WHICH} date'"
386 DU="'${WHICH} du'"
387 EXPR="'${WHICH} expr'"
388 FIND="'${WHICH} find'"
389 RM="'${WHICH} rm'"
390 MYSQL="'${WHICH} mysql'"
391 MYSQLDUMP="'${WHICH} mysqldump'"
392 GZIP="'${WHICH} gzip'"
393 BZIP2="'${WHICH} bzip2'"
394 CP="'${WHICH} cp'"
395 HOSTNAMEC="'${WHICH} hostname'"
396 SED="'${WHICH} sed'"
397 GREP="'${WHICH} grep'"

Atualização:

é

"'${WHICH} gawk'"

praticamente o mesmo que

"${${WHICH} gawk}"
    
por Stann 18.04.2011 / 22:35

3 respostas

10

WHICH="'which which'" é exatamente equivalente a WHICH='which which' ou WHICH=$(which which) ou WHICH="$(which which)" . Todos eles executam o comando which which e capturam sua saída (como uma string) na variável WHICH , removendo qualquer nova linha final da saída. Da mesma forma, AWK="'${WHICH} gawk'" pode ser escrito AWK='$WHICH gawk' .

Normalmente, as substituições de comandos ( 'command' ou $(command) ) devem ser colocadas entre aspas duplas, caso o resultado contenha curingas de espaços em branco ou de concha ( *?[\ ). Isso ocorre porque o resultado de substituições de comandos, como substituições de variáveis ( $foo ou ${foo} ), sofre divisão de palavras e geração de nome de arquivo (também conhecido como globbing). No entanto, isso não se aplica a atribuições de variáveis simples: como o contexto requer uma única palavra, o resultado da substituição é considerado como está. Portanto, as atribuições são uma exceção à regra geral de que você deve duplicar as substituições de comando e variável. (Observe que essa exceção não se estende a export var="$value" , que exige as aspas duplas.) Mas é uma prática razoável de programação shell sempre as aspas duplas - omitir elas somente se você sabe que deve, em vez de usá-las apenas se sei que você deve.

No (improvável) caso which which retorna um caminho com espaços ou curingas, ${WHICH} deve ser colocado entre aspas nas linhas abaixo, ou seja, um dos

AWK="'"${WHICH}" gawk'"
AWK='"${WHICH}" gawk'
AWK="$("${WHICH}" gawk)"
AWK=$("${WHICH}" gawk)

(Usar $(…) é recomendado acima de '…' , devido à dificuldade de obter as citações aninhadas dentro de '…' . No entanto, shells muito antigas não reconhecem $(…) , então '…' é necessário para scripts que deve ser executado em sistemas mais antigos.)

Veja também $ VAR vs $ { VAR} e para citar ou não citar

    
por 18.04.2011 / 23:19
0

No caso de os backticks retornarem uma string com espaços. As aspas asseguram que o valor único completo seja atribuído à variável.

    
por 18.04.2011 / 22:37
0

O operador backtick significa "substitua a área entre os backticks pela saída do comando encontrado dentro dos backticks. As aspas duplas são assim, se essa saída contiver espaços, a variável em questão será configurada para o resultado completo e não apenas tudo até o primeiro espaço em branco.

Por exemplo, se por algum motivo seu comando grep for '/ usr / local / bin / grep real', após a execução de

GREP='which grep'

O GREP conteria "/ usr / local / bin / real"

Considerando que,

GREP="'which grep'"

O GREP conteria "/ usr / local / bin / grep real".

É muito improvável que qualquer um dos caminhos desses comandos contenha espaço em branco, mas é recomendável que as práticas em scripts de shell sempre usem aspas duplas ao atribuir a uma variável.

    
por 18.04.2011 / 22:40