Algum problema ao atribuir uma variável a outra no shell sem usar aspas? [duplicado]

5

Esta questão é sobre atribuir todo o conteúdo de uma variável a outra variável.

A variável não está sendo usada (enviada para echo , etc.)

Nenhuma expansão de parâmetros está sendo feita durante a atribuição.

Minha pergunta também se refere apenas ao shell POSIX (nenhum array sendo usado aqui).

error="You have an error in your input"

newVar="$error"
# vs.
newVar=$error
#         ↑
#         └─This assignment is the question. It doesn't seem that quotes are
#           needed here in order to assign the entire contents of $error to
#           a new variable.

#                 ┌─(But quotes are required when they're used.)
#                 ↓
printf "%s\n" "$error"
# => You have an error in your input
printf "%s\n" "$newVar"
# => You have an error in your input

Há alguma pegadinha que eu estou perdendo apenas escrevendo newVar=$error ?

Atualizar :

Independentemente do que está em $error , eu quero saber que os mesmos dados serão transferidos para $newVar sem gerar erros ou distorcer os dados.

$ error="Test * ${1} \n [!a] [[:punct:]] ./test \t \n \"
$ newVar=$error
#       ↑
#       └─Does this step ever fail or cause the two variables to differ?
$ echo "$error"
Test *  \n [!a] [[:punct:]] ./test \t \n \
$ echo "$newVar"
Test *  \n [!a] [[:punct:]] ./test \t \n \
    
por Caleb Paul 05.08.2015 / 18:35

1 resposta

12

Em shells do tipo Bourne (se nos esquecermos de bugs 1 em algumas implementações antigas de alguns shells)

var=$otherVar

está bem. Você está atribuindo a uma variável escalar, então não pode haver glob + splitting aqui, então você não precisa escrever var="$otherVar" (embora as citações não causem dano aqui).

Uma exceção é para:

var=$*

e:

var=$@

Você deve usar apenas var="$*" . O comportamento de var=$@ var=$* var="$@" varia entre os shells quando o primeiro caractere de $IFS não é espaço.

Claro, em:

array=("$var")

Você precisa das aspas, caso contrário, os elementos da matriz receberiam o resultado da divisão + globbing de $var .

Observe também que você precisa das aspas em:

export var="$otherVar"

com muitas shells (nelas, aqui, é um comando simples, então split + glob ocorre).

E em:

env var="$otherVar" cmd

Ou

awk -v var="$otherVar"...

Em caso de dúvida, use as aspas.

1 Algumas versões antigas do zsh tiveram um problema com a barra invertida na frente de caracteres curinga quando em sh emulação:

$ (a='\*' exec -a sh zsh-3.1.9 -c 'b=$a; printf "%s\n" "$b"')
*
$ (a='\*' exec -a sh zsh-3.1.9 -c 'b="$a"; printf "%s\n" "$b"')
\*

Isso foi corrigido há muito tempo.

    
por 05.08.2015 / 18:47