Estou seguindo este guia de script do shell bash:
Na seção Comparações Numéricas, cita um exemplo:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
O que parece acontecer acima é que armazenamos uma sequência de comandos em uma variável bash e, em seguida, invocamos eco na variável. O que parece acontecer é que a cadeia é avaliada e o comando wc é executado e retorna a contagem de linhas para o terminal de controle.
Ok, então inicio o meu terminal no Ubuntu 12.04 e tento algo semelhante:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Espere um segundo, que não avaliou a string e retornou a contagem de linhas. Isso ecoou a corda de volta ao terminal. Por que obtive resultados diferentes?
command-line
bash
scripts
JohnMerlino
fonte
fonte
wc -l work.txt
, em vez disso, é atribuído o número 201.Respostas:
Você precisa usar backticks para avaliar a expressão.
Se você deseja ver apenas "1" na saída, use o comando
E também funciona:
Para obter informações adicionais, consulte Diferenças entre de aspas "", singlequotes '' e acentos graves '' na linha de comando?
fonte
wc
comando funciona. Tentecat sample.txt | wc -l
.Observe esse símbolo:
Citação única
e
Backquote
Portanto, o Backquote está retornando o resultado do comando para Saída padrão. É por isso que
retorna resultados do comando, enquanto
basta retornar "wc -l sample.txt" como uma string usual
Considere fazer isso como exemplo:
E agora faça eco das três variáveis:
fonte
Se você deseja capturar a saída de um comando em uma variável, é necessário usar backticks
``
ou colocar o comando em$()
:Observe que a string é realmente avaliada no momento da declaração da variável, não quando você a reproduz. Na verdade, o comando é executado dentro dos
$()
backticks ou e a saída desse comando é salva como o valor da variável.Em geral, você deve sempre usar, em
$()
vez de backticks, que foram descontinuados e apenas disponíveis por razões de compatibilidade e muito mais limitados. Você não pode, por exemplo, aninhar comandos nos backticks, mas pode$()
:Veja este tópico no U&L para obter mais detalhes sobre por que
``
deve ser evitado.fonte
$(
)
a`
`
. Mas, como wag diz , crase fazer ninho.echo $(date -d $(echo yesterday))
torna-seecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
torna-seecho `echo \`date -d \\\`echo yesterday\\\`\``
. Digo isso não para refutar sua tese, mas para fortalecê-la : citações internas vazias tornam a`
`
sintaxe mais poderosa do que se costuma admitir, mas o tratamento especial\
é estranho, surpreendente e difícil de raciocinar. Com o$(
)
que você vê é geralmente o que você recebe.