Ao lidar com expansões de parâmetros aninhados, qual dessas é a maneira correta de citar as coisas?
Este:
var="${var#"${var%%[![:space:]]*}"}"
Ou este:
var="${var#${var%%[![:space:]]*}}"
Eu vi isso feito nos dois sentidos. A primeira variação é um trecho de uma resposta do Stack Overflow . É uma das respostas mais votadas para a pergunta (a pergunta é sobre como cortar o espaço em branco de uma variável).
Também estou tendo problemas para encontrar uma fonte respeitável que aborda como citar coisas ao trabalhar com uma "palavra" ou "padrão" que é uma variável em vez de texto literal. Dos dois abaixo, qual está correto?
Este:
strip_ext="${filename%."$filename_ext"}"
Ou este:
strip_ext="${filename%.$filename_ext}"
Parece depender de como você deseja que o lado direito da expansão seja interpretado. Como um padrão ou como uma string literal.
Aqui, o sem aspas
*
é um padrão e come a string inteira. O citado apenas remove um asterisco literal:É o mesmo se colocar o padrão através de uma variável:
Ou com outra expansão de parâmetro no lado direito:
(
${pat//x}
resulta em apenas*
novamente.)Recebo o mesmo comportamento com todos os shells do tipo POSIX que tentei (Bash, ksh, yash). Zsh é diferente, é claro, todas as expansões de parâmetros no lado direito agem como se estivessem citadas lá, como também em relação a problemas de divisão de palavras. Suponho que haja algum operador que possa ser usado em uma expansão para mudar isso.
Em ambos os casos, a primeira maneira geralmente é a que você deseja. Quando a string do lado direito
${var#*a}
não está entre aspas, ela é interpretada/expandida como um padrão. Neste exemplo, removendo o texto inicial até a primeira letraa
. Se citado:${var#"*a"}
a expansão removeria um literal*a
. Isso pode ser um problema se em:o
"$filename_ext"
pode conter caracteres padrão. Da mesma forma, se$var
in"${var#"${var%%[![:space:]]*}"}"
puder conter caracteres padrão (*?[) e você não quiser que eles sejam interpretados como um padrão, cite a expansão como:Observe que o lado direito de uma atribuição de variável é considerado entre aspas e não precisa (mas não causa danos) aspas, essas duas também estão corretas: