2010-01-21 5 views
0

S'il vous plaît aidez-moi à trouver problèmeen cas d'erreur de déclaration bash

t1=$(sort -k 2,2 f.txt|head -1|cut -d" " -f3) 
while read x 
do 
t2=$(echo $x|cut -d" " -f2) 
if [ $t2 -ge $t1 ] ; then 
    p=$(echo $x|cut -d" " -f1) 
    echo -n $p " " 
fi 
done <f.txt 

f.txt
F1 13
G 13
H 0
Je Geeting erreur suivant

-sbash: [: 13: unary operator expected 
-sbash: [: 13: unary operator expected 


sans H 0 ligne cela fonctionne correctement

Répondre

1

'opérateur unaire attendu' est l'erreur lorsque vous utilisez un opérateur binaire avec un seul opérande.

Cela signifie que t2 ou t1 est vide. Pour provoquer une variable vide pour ne pas disparaître, utilisez la notation par défaut ${VARIABLE:-DEFAULT} pour leur donner une valeur par défaut:

if [ ${t2:-0} -ge ${t1:-0} ]; then 
0

Je pense que vous voulez

t1=$(sort -k 2,2 f.txt|head -1|cut -d" " -f2) 

au lieu de

t1=$(sort -k 2,2 f.txt|head -1|cut -d" " -f3) 

Votre f.txt a seulement deux champs, donc la commande cut ne donne rien, et vous passez ensuite à [ ].

pourquoi il fonctionne sans la ligne H 0, je pense que votre ligne F est

F 1 13 

au lieu de

F1 13 

(Ceci est tout juste une supposition.)

1
vous

utilisent bash, utilisez donc les internes de bash. Pas besoin d'appeler une coupure externe, etc. citez également vos variables lorsque vous utilisez []

set -- $(sort -k 2,2 f.txt|head -1) 
t1=$3 
while read f1 f2 f3 
do 
t2="$f2" 
if [ "$t2" -ge "$t1" ] ; then 
    p=$f1 
    echo -n $p " " 
fi 
done <f.txt 
+0

Quoi? Si vous avez déjà cité la variable avant l'instruction-test, il n'est pas nécessaire de la citer à nouveau, j'ai même pensé que c'était une mauvaise étiquette. – Anders

+0

@Anders: 'v1 =" "; ["$ v1" = ''] && echo "match" 'contre' v1 = ""; [$ v1 = ''] && echo "non imprimé en raison d'une erreur" 'versus' v1 = ""; [[$ v1 == '']] && echo "pas de guillemets nécessaires" ' –

Questions connexes