Que situações existem onde variáveis Bash não devem ser duplamente citadas? [duplicado]

3

Estou ciente de várias situações em que é desnecessário usar aspas duplas ao expandir uma variável no Bash, como dentro de [[...]] , ou quando usado no lado direito de uma atribuição de variável.

Ao ler sobre citar variáveis, muitas vezes ouço que muitas vezes é melhor usar apenas aspas duplas em todos os lugares, pois há apenas alguns poucos casos em que você não os deseja.

Quais são os casos em que o comportamento de citar é indesejável? Não estou falando sobre situações em que você não precisa citar, mas onde citar uma variável ativamente impedirá que algo funcione.

    
por Arronical 18.11.2016 / 11:00

3 respostas

3

Não cite quando quiser que uma variável vazia desapareça (diferentemente de permanecer como uma string vazia):

verbose=
[[ some_condition ]] && verbose=-v

# ...later...

some_program $verbose some_args

Não cite quando sua variável contém argumentos separados por espaço em branco e você deseja que o shell os trate como palavras separadas

exclude_file=
[[ -s excludelist.txt ]] && exclude_file='--exclude excludelist.txt'

# ...later...

rsync -avP $exclude /path/to/source/ remote:target

A abordagem geral é sempre usar aspas duplas , a menos que você saiba por que não as quer .

    
por 18.11.2016 / 11:33
1

Evitar citações é desejável quando queremos que o shell pense "oh, estes são todos elementos separados, não um todo!". Tal coisa pode ser bastante útil com arrays.

bash-4.3$ var="one two three"
bash-4.3$ arr=( $var  )
bash-4.3$ for i in "${arr[@]}"; do echo "$i"; done
one
two
three

Em particular, isso é útil quando você está gerando uma matriz como no exemplo acima. Eu pessoalmente usei essa abordagem ao enumerar endereços reais dos espaços de trabalho do Ubuntu (a terminologia exata é viewports, e eles usam formato de coordenadas como X, y, mas isso é muito diferente).

Outra abordagem é quando você está dando a variável para outro comando que precisa processá-los como itens separados. Comparar:

bash-4.3$ bash -c 'for item; do echo $item; done' sh "$var"
one two three
bash-4.3$ bash -c 'for item; do echo $item; done' sh $var
one
two
three

Para abordar o que foi mencionado nos comentários, esses exemplos não devem ser usados com "entrada inesperada", e sim com ambiente controlado. Além disso, set noglob pode ser usado se a globalização tiver que ser evitada, mas novamente - se você estiver gerando uma matriz para determinadas combinações de strings como valores numéricos de viewports de desktop, não há nenhum perigo de glog . Se você está lidando com a entrada real do usuário, então aspas devem ser usadas, e este não é o tópico desta questão.

    
por 18.11.2016 / 11:37
-2

[] = integrado, maior portabilidade

[[]] = comando composto, funcionalidade aumentada

proponha o uso de colchetes únicos ao criar scripts recuados para serem compartilhados em várias plataformas.

    
por 18.11.2016 / 11:10