Como combinar bash arithmetic com saída de comando?

2

Suponha que você tenha dois comandos:

Primeiro comando

let foo=2+2
echo $foo
4

Segundo comando

date "%s"
1377107324

Como você os combinaria?

Tentativa 1.

echo The epoch time is: 'date +%s' in 100 seconds the time \
     will be: 'let future={date +%s}+100' $future

Tentativa 2.

echo The epoch time is: 'date +%s' in 100 seconds the time \
     will be: 'let future=(date +%s)+100' $future

Mais cerca de 30 outras tentativas semelhantes

    
por spuder 21.08.2013 / 20:26

3 respostas

4

Esse é um motivo importante para usar o $( ) em vez de ' ' (consulte Qual é a diferença entre $ (stuff) e 'stuff'? )

Se você aninhar assim, você não precisa nem de let ou de uma variável:

$ echo $(date +%s) " "  $(( $(date +%s)+100 ))
1377110185   1377110285
    
por 21.08.2013 / 20:37
3

Você precisa adicionar um $ antes dos parênteses e também exportar $future :

$ echo The epoch time is: 'date +%s' in 100 seconds the time  will be: \
 'let future=$(date +%s)+100; export future' $future
The epoch time is: 1377110177 in 100 seconds the time will be: 1377110252

Variáveis não são compartilhadas entre instâncias do bash. Sempre que você executar um comando $() (ou backticks), as variáveis definidas dentro dele não estarão acessíveis ao shell pai:

$ foo=$(echo 12);
$ echo $foo
12
$ foo=(echo 12; foo=0)
$ echo $foo
$ echo $foo
12

Como você pode ver, embora você defina foo para 0 no subshell $() , esse valor não é exportado para o shell pai.

    
por 21.08.2013 / 20:36
3

Declare as variáveis, exporte-as e use-as como desejar:

date=$( date +%s )
future=$(( $date + 100 ))

echo "The epoch time is: $date in 100 seconds time will be: $future"

que dá:

The epoch time is: 1377110185 in 100 seconds time will be: 1377110285

E você pode continuar usando esses valores:

echo "which is the same as $(( $date + 100 ))"  

que dá:

which is the same as 1377110285

Note que se eles estiverem em um script, eles não precisam ser exportados, somente na linha de comando você precisa exportá-los para serem usados em comandos subseqüentes.

Ou você pode deixar todas as variáveis juntas:

echo "The epoch time is: $(date +%s) in 100 seconds the time will be: $(( $(date +%s)+100 ))"

Observe que "data +% s \ e $( date +%s ) são muito semelhantes, mas esse é outro tópico melhor abordado neste Resposta

    
por 21.08.2013 / 20:45

Tags