Em um script de shell, value
e "value"
e 'value'
são todos equivalentes. Você pode optar por usar citações ou não. A razão pela qual aspas existem é que, às vezes, você quer colocar um caractere com um significado especial em uma string e, em seguida, as aspas permitem que o shell saiba que o caractere especial faz parte da string. Por exemplo:
var=value more
var='value more'
var="value more"
var=value\ more
A primeira linha atribui o valor value
(uma string de 5 caracteres) à variável cujo nome é var
; more
é uma palavra separada desse comando, pois há um espaço antes dele e o efeito do espaço é que o comando executa o programa more
com a variável de ambiente var
definida como value
. As outras três linhas têm o mesmo significado: elas apenas configuram a variável var
para o valor value more
(uma string de 10 caracteres, em que o 6º caractere é uma string). Aspas simples '…'
e "…"
envolvem uma string. A terceira possibilidade de citar é a barra invertida, que cita apenas o próximo caractere.
A diferença entre aspas simples e aspas duplas é aquela entre aspas simples, cada caractere significa si mesmo, mas entre aspas duplas, alguns caracteres ainda são interpretados. Em particular, "\"
é uma string contendo uma única barra invertida, porque a folga na string é interpretada como a citação do caractere seguinte, e da mesma forma "\""
é uma string contendo apenas aspas duplas; "\$var"
é uma cadeia de 4 caracteres que começa com um cifrão, enquanto "$var"
é uma cadeia que é o valor da variável var
. Em contraste, '$var'
é uma cadeia de 4 caracteres que começa com um sinal de dólar e '\$var'
é uma cadeia de 5 caracteres que começa com uma barra invertida.
Há mais sutilezas para fazer citações, e não vou entrar nelas aqui; leia um livro ou um manual (por exemplo, o manual do bash ) para detalhes, e talvez pesquise a tag quoting neste site.
Observe que o comando set
não atribui um valor a uma variável. set variable value
não atribui um valor à variável variable
, a sintaxe para isso seria variable=value
. O que o comando set
faz é substituir os parâmetros do script (ou função). Quando você executa um script com argumentos, eles estão disponíveis no script em variáveis especiais que possuem um número em vez de um nome: $1
, $2
,…. Essas variáveis são chamadas de parâmetros posicionais (parâmetros porque são os parâmetros do script / função, posicionais porque são acessados por sua posição na lista de parâmetros). Você não pode atribuir a essas variáveis usando o número ( ), mas você pode definir todos os parâmetros posicionais executando 1=foo
set
com parâmetros. Por exemplo:
#!/bin/sh
echo "$1"
set hello world
echo "$1"
Este script imprime o primeiro argumento que foi passado em sua linha de comando e, em seguida, imprime hello
. O set
builtin tem outros trabalhos, consulte o manual para mais detalhes.
Para programação básica de shell, você pode esquecer este uso de set
por enquanto. As noções básicas de cotação são importantes. Uma coisa que você precisa saber é sempre usar aspas duplas em torno de expansões variáveis, isto é, "$foo"
e não simples $foo
, porque simples $foo
manipula o valor .
Tudo que escrevi nesta resposta é sobre shells ao estilo Bourne / POSIX: sh
, dash
, bash
, ksh
, zsh, etc. Existem outras famílias de shell menos comuns com sintaxe diferente. Em (t) csh, set
está envolvido em algumas atribuições, mas um sinal de igual ainda está envolvido; citando com \'"
é um pouco semelhante mas não idêntico. Em peixes, set variable value
define a variável variable
como o valor value
; lá também citando com \'"
é um pouco semelhante, mas não idêntico.