O Gnouc faz um ponto importante sem enfatizá-lo:
sempre que você fizer referência a uma variável de shell ( $identifier
, por exemplo, $futur
)
ou um parâmetro posicional ( $digit
, por exemplo, $1
),
você deve colocá-lo entre aspas duplas
(por exemplo, "$1"
), a menos que você tenha um bom motivo para não
e você tem certeza de que sabe o que está fazendo.
Sequências constantes sem caracteres especiais (por exemplo, A
, foo
ou bar
)
não precisa ser citado, mas não dói.
As strings entre aspas podem ser concatenadas e combinadas;
por exemplo, "foo""bar"
é equivalente a "foobar"
,
e A"$1"
é equivalente a "A""$1"
e, portanto, "A$1"
.
-
As cotações preservam a existência de cadeias vazias.
Como Gnouc explica, se seu roteiro dissesse
if ( $1 == "" )
e você invoca sem argumentos,
LIST
ou com um argumento de cadeia vazia explícito,
LIST ""
, a declaração if
será "expandida" como
if ( == "" )
que causa um erro de sintaxe.
-
As cotações preservam a integridade das sequências com espaços ou caracteres especiais.
Se você invocar seu script com um argumento contendo um espaço,
LIST "foo bar"
, a declaração if
( if ( A$1 == A )
) será expandida como
if ( Afoo bar == A )
que causa um erro de sintaxe.
Resultados semelhantes acontecem se você invocar seu script com um argumento contendo um caractere curinga entre aspas:
LIST "foo*"
Mas ninguém explicou por que o roteiro não diz apenas
if ( "$1" == "" )
Nas versões anteriores de csh
, se você invocar seu script com o argumento this ,
LIST ==
, a declaração if
será expandida como
if ( "==" == "" )
que também causou um erro de sintaxe.
As pessoas escreveram suas declarações if
com proteção para parâmetros posicionais
(e, quando apropriado, variáveis de shell / variáveis de ambiente),
como A$1
ou "A$1"
, para evitar que os argumentos (operandos) se pareçam com operadores
(particularmente /
, também +
, -
e *
) e fazendo com que o analisador seja confundido.
Isso parece ter sido corrigido (pelo menos em algumas versões do csh
/ tcsh
).
Eu apenas tentei isso na minha versão (do Cygwin) de tcsh
:
$ if ( == == "" ) echo yes
if: Expression Syntax.
$ if ( == == == ) echo yes
if: Expression Syntax.
$ if ( "==" == "" ) echo yes
<--- (no output)
$ if ( "==" == "==" ) echo yes
yes
$ if ( / == / ) echo yes
Division by 0.
$ if ( "/" == "/" ) echo yes
yes
então,
- As cotações podem informar o comando
if
em tcsh
que um argumento é um operando
e não um operador.