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.