Fechando vs. não colocando o valor de uma variável entre aspas no bash [duplicado]

3

Quando faço algo assim:

x="hi echo hello"

ou

x='hi echo hello'

Em seguida, x conterá a string hi echo hello .

Mas quando não uso aspas:

x=hi echo hello

Em seguida, x conterá a string hi e o comando echo hello será executado.

Mas e quando o valor de uma variável consiste apenas em uma única palavra, existe uma diferença entre o seguinte:

x="hi"
x='hi'
x=hi
    
por user268325 01.01.2018 / 13:38

3 respostas

2

Apenas se o mundo contiver substituições.

Então

x=$FRED

é diferente de:

x='$FRED'
    
por 01.01.2018 / 14:14
1

Não, letras e números simples não mudam de significado se forem citados ou não.

Além disso, como mencionado em esta resposta , nenhuma palavra dividida após uma expansão ou globalização de nomes de arquivo acontecem ao fazer uma atribuição, portanto, os caracteres glob não são especiais nesse contexto e, diferentemente da maioria dos outros locais, é possível usar variáveis sem aspas sem chamar divisão. var1=* atribui o asterisco literal e var2=$var1 atribui o valor de var1 , independentemente de quaisquer caracteres IFS.

Outros caracteres especiais ainda são especiais:

  • espaço em branco
  • $ e backticks ' usado para expansões (como @Julian anotou)
  • parênteses, que são usados para atribuição de matriz (como anotado @cas). Eles causarão um erro de sintaxe se forem perdidos
  • ! para expansão do histórico, <>| para redirecionamentos, ; e & que finalizam os pipelines e barras invertidas \ que escapam de outros caracteres.

Todos esses precisam ser citados ou evitados para evitar seu significado especial.

    
por 01.01.2018 / 20:29
1

A primeira coisa que o shell faz é dividir a linha em espaços sem aspas (metacaracteres) em tokens. Isso é diferente da divisão de palavras feita após as expansões em que o valor do IFS é não usado. Os caracteres usados para a divisão inicial do token são fixados como metacaracteres. Tudo isso fará com que var contenha Hello (às vezes por um breve momento):

var=Hello echo World       # Space
var=Hello;echo World       # Semicolon
var=Hello   echo World     # Tab
var=Hello&echo World       # Ampersand

Além disso, para essa divisão inicial de token, o lado direito de uma atribuição é considerado citado.
Tudo isso é equivalente:

var="Hello World"
var='Hello World'
var=Hello\ World

Observe que o único caractere que deve ser citado é o espaço em branco. Mesmo se o IFS for modificado.

Claro, dentro de aspas duplas, várias expansões são permitidas:

var=~"/"       ;  var=~/         tilde  expansion (outside quotes)
var="$PWD"     ;  var=$PWD       parameter  and variable expansion
var="$(pwd)"   ;  var=$(pwd)     command substitution
var="$((2+3))" ;  var=$((2+3))   arithmetic expansion
var="!$"       ;  var=!$         history substitution

Todos os pares acima são equivalentes (o mesmo).

Nenhum dos pares funcionará com as mesmas aspas simples internas (ou com algumas aspas de retorno), exemplo:

var='$PWD'     ;  var=\$PWD

Além disso, isso é não equivalente:

var="( Hello World )"   ; var=( Hello World )

Os parênteses acionam uma atribuição de matriz

Então, tudo isso é equivalente:

var=hi
var="hi"
var='hi'
var=\hi
var=h\i
var=\h\i

tendo em conta as condições especiais dadas anteriormente.

    
por 01.01.2018 / 22:21