DNF_OPTS=('--disableplugin=subscription-manager' '--disablerepo=*' '--enablerepo=a,b,c')
dnf update -y "${DNF_OPTS[@]}" some-pkg
O comando é executado como:
dnf update -y --disableplugin=subscription-manager '--disablerepo=*' '--enablerepo=a,b,c'
Observe as aspas simples em torno dos argumentos --disablerepo
and --enablerepo
-- como faço para me livrar delas?
Não há aspas nesses elementos da matriz:
Como você pode ver na saída de
printf
,printf
recebeu esses argumentos sem aspas.Aspas foram usadas na sintaxe do shell da atribuição de matriz para proteger caracteres especiais no valor dos elementos.
Por exemplo,
*
é especial na sintaxe do shell earray=( --disablerepo=* )
teria feito$array
com que todos os nomes de arquivos no diretório de trabalho atual que começassem com--disablerepo
(e se não houvesse tal arquivo, e erro sefailglob
estivesse habilitado, nada senullglob
estivesse habilitado ou--disablerepo=*
não), então você estava certo em usar aspas aqui.Você notará que ambos
typeset -p
e oxtrace
rastreamento produzem código shell que pode ser usado para reconstruir a mesma matriz e executar o mesmo comando, respectivamente.No caso de
typeset -p
, todos os valores foram citados com aspas duplas, no caso dextrace
, apenas aqueles que precisavam ser citados e com aspas simples, isso é apenas uma escolha de estilo de codificação,xtrace
poderiam muito bem ter uma saída:Aqui citando todos os
printf
argumentos e com aspas simples, a forma forte das aspas. Ou em outras palavras, deixando sem aspas apenas o caractere que deve permanecer sem aspas para que ele retenha seu significado especial como um delimitador de argumento: o caractere de espaço.Ou:
Aqui, usando todos os 4 operadores de aspas de shell na sintaxe da linguagem bash (
\
,"..."
,'...'
,$'...'
, aqui omitindo$"..."
o que faz a localização além das aspas) e apenas para os caracteres que precisam dessas aspas (<
,>
que são operadores de redirecionamento,\
que é um operador de aspas e*
um operador de englobamento).Ambos são códigos de shell que, uma vez interpretados pelo shell, resultariam na execução do mesmo comando com a mesma lista de argumentos.
Para que esses elementos da matriz contivessem essas aspas, você teria que escrever a atribuição algo como:
Aqui citando as aspas simples com
"..."
ou\
então elas são incluídas literalmente no valor dos elementos.Então:
A
xtrace
saída é um pouco desajeitada aqui. A aspa simples foi citada como\'
, mas há outras strings com aspas simples ao redor dela, incluindo''
as vazias, o que dificulta a leitura.