No bash, como chamar uma variável e envolver aspas em torno de seu valor como parte de um comando sem fazer com que o nome da variável se torne um literal de string?

1

Então, quero adicionar 10 segundos por vez. O comando para fazer isso veio de aqui .

Para ilustrar:

STARTIME="$(date +"%T")"
ENDTIME="$STARTIME today + 10 seconds"
CALL="$(echo date -d $ENDTIME +'%H:%M:%S')"

O problema que tenho com esse código é que, se eu fizer eco da variável $CALL , ele fornecerá:

date -d 12:51:19 today + 10 seconds +%H:%M:%S

A versão correta desta string seria semelhante:

date -d "12:48:03 today + 10 seconds" +'%H:%M:%S'

Mas se eu envolver o nome da variável entre aspas, assim:

STARTIME="$(date +"%T")"
ENDTIME="$STARTIME today + 10 seconds"
CALL="$(echo date -d '$ENDTIME' +'%H:%M:%S')"

... é interpretado como um literal de string, e se você faz eco, ele dá:

date -d $ENDTIME +%H:%M:%S

Então, o que eu preciso fazer é chamar a variável de modo que seu valor seja trocado para a função e empacotado com aspas duplas ("), mas evite que o nome da variável seja lido como uma string literal. Eu sou extremamente confuso com isso, sinto falta do Python!

    
por evamvid 21.06.2015 / 18:56

3 respostas

5

Apenas pela perfeição, você não precisa de todos esses (") nem o% final$(echo ...). Aqui está a versão simplificada de suas tarefas que produzem o mesmo efeito:

STARTIME=$(date +"%T")
ENDTIME="$STARTIME today + 10 seconds"
CALL="date -d '$ENDTIME' +'%H:%M:%S'"

Note como você não precisa citar ao fazer var = $ (...), mas normalmente com var="muitas palavras":

a=$(echo 'a    b'); echo "$a" # result: a    b

Inside (") a (') não tem significado especial e vice-versa, por exemplo:

a="that's nice"; echo "$a" # result: that's nice
a='that "is nice'; echo "$a" # result: that "is nice
    
por 21.06.2015 / 20:02
3

Você pode editar seu extrato de chamada como:

CALL="$(echo date -d \"$ENDTIME\" +\'%H:%M:%S\')"

O \ pode ser usado para escapar dos caracteres " e ' . Agora echo $CALL será exibido como:

date -d "22:46:37 today + 10 seconds" +'%H:%M:%S'
    
por 21.06.2015 / 19:16
0

Coloque aspas simples dentro de sua variável ENDTIME com aspas duplas, assim:

ENDTIME="'$STARTIME today + 10 seconds'"
CALL="$(echo date -d "$ENDTIME" +'%H:%M:%S')"

Deve dar

date -d '19:35:28 today + 10 seconds' +%H:%M:%S
    
por 21.06.2015 / 19:38