Quando citar uma expansão de parâmetro e incluir o nome do parâmetro entre chaves?

0

Em uma expansão de parâmetro:

  • É sempre melhor (ou não pior) duplicar uma expansão de parâmetro do que não? Há casos em que não é sugerido o uso de citações duplas?

  • Quando é necessário adicionar chaves ao redor do nome do parâmetro?

  • quando usaremos aspas duplas em torno da expansão de parâmetro em vez das chaves em torno do nome do parâmetro? Quando o contrário? Quando um dos dois funciona?

Obrigado.

    
por Tim 04.02.2018 / 03:39

2 respostas

4

Citação

É sempre melhor citar as expansões de parâmetro quando quiser manter o valor expandido não dividido em várias palavras e afetado pelo valor do IFS. Por exemplo:

$ IFS=" elr"
$ var="Hello World"
$ printf '<%s> ' $var; echo
<H> <> <> <o> <Wo> <> <d>

$ printf '<%s> ' "$var"; echo
<Hello World>

No entanto, há algumas instâncias muito limitadas que exigem uma expansão sem aspas para que a divisão seja realmente concluída:

$ IFS=$' \t\n'
$ var="one two three"
$ array=($var)
$ declare -p array
declare -a array=([0]="one" [1]="two" [2]="three")

Links sobre o assunto:
Quando é necessário citar duaspas?
Gilles
Stéphane Chazelas

Aparelho

As chaves são sempre necessárias quando os caracteres após o nome da variável não devem ser unidos a esse nome de variável:

$ var=one
$ echo "The value of var is $varvalue"
The value of var is
$ echo "The value of var is ${var}value"
The value of var is onevalue

De LESS="+/which is not to be interpreted as part" man bash

${parameter}
The braces are required … when parameter is followed by a character which is not to be interpreted as part of its name.

Adicionalmente; chaves são necessárias quando se lida com qualquer parâmetro posicional de dois dígitos.

$ set -- one two t33 f44 f55 s66 s77 e88 n99 t10 e11 t12
$ echo "$11 ${11} $12 ${12}"
one1 e11 one2 t12

Leia o manual: LESS="+/enclosed in braces" man bash

When a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces

ou LESS="+/with more than one digit" man bash

${parameter}
The value of parameter is substituted. The braces are required when parameter is a positional parameter with more than one digit, …

Citações vs chaves

when shall we use double quote around parameter expansion instead of braces around parameter name? When the other way around? When does either of the two work?

Não há regra para "deve" apenas a possibilidade de usar:

$ var=One
$ echo "ThisIs${var}Var"
ThisIsOneVar

$ echo "ThisIs""$var""Var"
ThisIsOneVar

$ echo 'ThisIs'"$var"'Var'
ThisIsOneVar

$ echo 'ThisIs'"${var}"'Var'
ThisIsOneVar

Todas as expansões são totalmente equivalentes, use qualquer uma que você goste mais.

    
por 04.02.2018 / 04:01
2

Um caso em que chaves são necessárias é quando você vai usar a variável como parte de uma string:

$ var=test
$ echo "stuff$varmorestuff"
stuff
$ echo "stuff${var}morestuff"
stufftestmorestuff

Sem chaves, o shell pensa que estou tentando expandir uma variável chamada varmorestuff , que não está definida.

Do manual de referência do bash 3.5.3 Expansão do Parâmetro do Shell :

The ‘$’ character introduces parameter expansion, command substitution, or arithmetic expansion. The parameter name or symbol to be expanded may be enclosed in braces, which are optional but serve to protect the variable to be expanded from characters immediately following it which could be interpreted as part of the name.

Do manual do shell 2.6.2 Expansão do Parâmetro

If the parameter name or symbol is not enclosed in braces, the expansion shall use the longest valid name (see the Base Definitions volume of IEEE Std 1003.1-2001, Section 3.230, Name), whether or not the symbol represented by that name exists.

Além disso, chaves adicionais são necessárias quando se lida com qualquer parâmetro posicional de dois dígitos.

script.sh

#!/bin/sh
if [ "$1" = 'correct' ]; then
        echo "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
else
        echo "$2" "$3" "$4" "$5" "$6" "$7" "$9" "$9" "$10"
fi

Em ação:

$ ./script.sh one two three four five six seven eight nine ten
two three four five six seven nine nine one0
$ ./script.sh correct two three four five six seven eight nine ten
two three four five six seven eight nine ten

Do manual bash 3.4.1 Parâmetros posicionais

Positional parameter N may be referenced as ${N}, or as $N when N consists of a single digit.

Do manual do shell 2.6.2 Expansão de Parâmetros

The parameter name or symbol can be enclosed in braces, which are optional except for positional parameters with more than one digit or when parameter is followed by a character that could be interpreted as part of the name. The matching closing brace shall be determined by counting brace levels, skipping over enclosed quoted strings, and command substitutions.

    
por 04.02.2018 / 03:47

Tags