2012-05-01 12 views
8

Come cambio questo var?Modifica variabili in bash

max=0; 
min=20000000; 
cat |while read 
do 
    read a 
    if [[ $a -gt $max ]] 
    then 
     max=a` 
    fi 
    `if [[ $a -lt $min ]] 
    then 
     min=a 
    fi 
done 
echo $max 
echo $min 

Il mio min e il massimo sono ancora gli stessi, 0 e 2000000. Qualcuno può aiutarmi con questo? Non ne ho idea.

+0

Per quelli di noi che hai perso la tua domanda precedente, puoi fornire ulteriori informazioni per questo. Che cosa stai cercando di cambiare? –

+3

anche 'max = a' dovrebbe essere' max = $ a', lo stesso con 'min = a' dovrebbe essere' min = $ a' –

+0

Cosa dovrebbe essere 'min' se ogni valore è maggiore di 20000000? Immagino che 'min' e' max' dovrebbero essere il tuo primo valore ... –

risposta

13

Il (principale) problema con lo script è che l'impostazione min e max si verifica in una subshell, non nella shell principale. Quindi le modifiche non sono visibili dopo aver completato la pipeline.

Un altro è che stai chiamando leggere due volte: questo potrebbe essere inteso se vuoi saltare ogni altra linea, ma è un po 'insolito.

L'ultimo è quello min=a set min a a, letteralmente. Si desidera impostarlo su $a.

Utilizzando process substitution per sbarazzarsi del primo problema, rimuovere il (forse) non necessarie secondo in lettura, e che fissa le assegnazioni, il codice dovrebbe essere simile:

max=0 
min=20000000 
while read a 
do 
    if [[ $a -gt $max ]] 
    then 
     max=$a 
    fi 
    if [[ $a -lt $min ]] 
    then 
     min=$a 
    fi 
done < <(cat) # careful with the syntax 
echo $max 
echo $min 

+0

ahhhh Grazie ora capisco questo. Grazie :) – pkruk

+1

4 ° problema: backtick immotivati ​​nel mezzo della sceneggiatura, non spiegabili per errore da principianti. :) –

+0

@userunknown: ho pensato che quelli fossero il risultato di uno scontro con l'editor markdown, non presente nel codice :) – Mat

Problemi correlati