Citações problemáticas

1
#!/bin/ksh
typeset FILE_SIZE1=$(stat -f '%z' test.txt);
typeset -r BK_STATARGS="-f '%z'"
typeset FILE_SIZE2=$(stat ${BK_STATARGS} test.txt);
echo without arg var ${FILE_SIZE1}
echo with arg var... ${FILE_SIZE2}

Rendimentos ....

without arg var 216
with arg var... '216'

Talvez eu esteja perdendo o óbvio, mas não consigo consertar. Eu tentei todo tipo de coisas.

    
por user119886 11.01.2014 / 00:32

1 resposta

0

BK_STATARGS é uma variável cujo conteúdo é a string de 7 caracteres -f '%z' . Primeiro, vamos ver o que acontece no comando

stat "${BK_STATARGS}" test.txt

O shell primeiro analisa o comando em uma árvore de sintaxe, que consiste em um único comando simples, com três tokens: stat , o resultado da expansão de ${BK_STATARGS} e test.txt . Em seguida, o shell expande o valor da variável para determinar a segunda palavra, que é -f '%z' (a mesma string de 7 caracteres). Finalmente, o shell executa o comando na primeira palavra, passando as palavras subsequentes como argumentos de linha de comando, então stat é executado com dois argumentos -f '%z' e test.txt .

Vamos agora voltar para o comando mais complexo

stat ${BK_STATARGS} test.txt

O processamento é o mesmo até a expansão do valor da variável. Como a substituição de variável não está entre aspas duplas, seu valor é tratado como uma lista de palavras separadas por espaços em branco. Há um caractere de espaço em branco na string, então ele é dividido em duas palavras e stat recebe três argumentos: -f , '%z' e test.txt .

As aspas simples fazem parte da sintaxe do shell: elas são reconhecidas no estágio de análise. Eles não têm um significado especial quando estão em uma string, mesmo que a string seja dividida após a expansão da variável.

Como % e z não são caracteres especiais, não é necessário citá-los:

typeset -r BK_STATARGS="-f %z"
typeset FILE_SIZE2=$(stat ${BK_STATARGS} test.txt)

Em geral, para passar vários argumentos para um comando, você precisa usar uma matriz em vez de uma string.

typeset -a BK_STATARGS; BK_STATARGS=(-f '%z')
typeset FILE_SIZE2=$(stat "${BK_STATARGS[@]}" test.txt)

"${BK_STATARGS[@]}" é a sintaxe para expandir uma matriz em sua lista de elementos. Mesmo que pareça uma única palavra devido às aspas duplas, ela é realmente dividida em várias palavras devido ao [@] subscrito, funcionando como "$@ .

    
por 11.01.2014 / 00:56