Strani problemi con bash $ ()


0
  • Ubuntu 10.10
  • GNU bash, versione 4.1.5 (1) -release (i686-pc-linux-gnu)
  • redis-cli fornito con Redis versione 2.0.0

Questo script funziona:

#! /bin/bash

set -e

f=$(echo 'bgrewriteaof_in_progress:0' | grep bgrewriteaof_in_progress | cut -d':' -f2)
test "${f}" = "0" && echo y || echo n
echo $f

stampe:

y
0

Questo script non funziona:

#! /bin/bash

set -e

f=$(redis-cli info | grep bgrewriteaof_in_progress | cut -d':' -f2)
test "${f}" = "0" && echo y || echo n
echo $f

stampe:

n
0

Com'è possibile? (Nota che echo $f stampe 0, quindi il risultato è lì.)

Risposte:


1

Trovato. Il redis-cli info stampa informazioni con terminazioni di linea di Windows (CRLF). inserzione dos2unix da qualche parte tra i tubi risolve il problema.


1
Alcuni suggerimenti per il debug: usa la stessa espressione nel tuo codice attuale e nel codice di debug (hai citato l'espansione usata con test , ma non con eco ); questo non influenzerebbe il tuo particolare problema questa volta, ma può essere un problema se il tuo parametro ha spazi bianchi IFS (in genere SP, HT o NL). Includere un prefisso e suffisso espliciti per enfatizzare i problemi di spazio bianco. echo "<<$f>>" sarebbe visualizzato come >>0 nel tuo caso (cioè il suffisso ha sovrascritto il prefisso a causa del CR finale). Puoi anche esaminare i byte non elaborati: printf %s "$f" | xxd (o od , HD , hexdump ecc. al posto di xxd ).
Chris Johnsen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.