Eu tenho o script abaixo para subtrair as contagens de arquivos entre dois diretórios, mas a COUNT=
expressão não funciona. Qual é a sintaxe correta?
#!/usr/bin/env bash
FIRSTV=`ls -1 | wc -l`
cd ..
SECONDV=`ls -1 | wc -l`
COUNT=expr $FIRSTV-$SECONDV ## -> gives 'command not found' error
echo $COUNT
Respostas:
Você só precisa de um espaço em branco extra ao redor do sinal de menos e backticks:
Esteja ciente do status de saída:
O status de saída é 0 se EXPRESSION não for nulo nem 0, 1 se EXPRESSION for nulo ou 0 .
Lembre-se disso ao usar a expressão em um script bash em combinação com set -e, que será encerrado imediatamente se um comando sair com um status diferente de zero.
fonte
sh
shell posix . Para portabilidade, convém usar esta resposta.Experimente esta sintaxe do Bash em vez de tentar usar um programa externo
expr
:BTW, a sintaxe correta do uso
expr
é:Mas lembre-se de que o uso
expr
será mais lento que a sintaxe interna do Bash que forneci acima.fonte
$(command)
sintaxe para substituição de comandos. Também desde apoio BASH operações aritméticas em$(( ... ))
não, é melhor usar um utilitário externoexpr
$(( ... ))
é usado para avaliar expressões aritméticas.Você pode usar:
para evitar a invocação de um processo separado, conforme a seguinte transcrição:
fonte
O espaço em branco é importante,
expr
espera que seus operandos e operadores sejam argumentos separados. Você também precisa capturar a saída. Como isso:mas é mais comum usar a expansão aritmética integrada:
fonte
É assim que eu sempre faço matemática no Bash:
fonte
|bc
comando de tipo do que perdê-lo uma ou duas vezes. Cursos diferentes para pessoas diferentes, como eles dizem.Para aritmética inteira simples, você também pode usar o comando let incorporado .
Para mais informações
let
, veja aqui .fonte
let "sanity_check_duration=sanity_check_duration_end_time_delay_sec - sanity_check_duration_start_time_delay_sec"
(sinal de remoção de dólar a partir de variáveis)Como alternativa aos 3 métodos sugeridos, você pode tentar
let
executar operações aritméticas em variáveis da seguinte maneira:let COUNT=$FIRSTV-$SECONDV
ou
let COUNT=FIRSTV-SECONDV
fonte
Use Python:
Resultado
fonte