2017-06-01 6 views
0

J'ai un problème avec la commande bc. La sortie générée est:Erreur de syntaxe Commande Bash bc

(standard_in) 2: syntax error 

Ici, je poste mon code, toutes les suggestions seront appréciées.

value="100%"   # the threshold to cause a break out 
kb="kB/s" 
mb="MB/s"    # strings to mask out 
conversor=1024  # kb->mb conversion 
contador=0   # initalize our total in megabytes 
for ((x=3; x<=${#array[@]}; x+=5)); do 
    paraula=${array[$x]}; 

    if [[ $paraula =~ .*kB.* ]]; then 
     paraula=${paraula%$kb} 
     paraula=$(echo "scale=4; $paraula/$conversor" | bc) # convert to $mb 
     contador=$(echo "scale=4; $contador+$paraula" | bc) 
     echo "Counting: "$contador 
    else 
     paraula=${paraula%$mb} 
     contador=$(echo "scale=4; $contador+$paraula" | bc) 
     echo "Counting: "$contador 
    fi 

    if [[ " ${array[$x]} " =~ " $value " ]]; then 
     break; 
    fi 
    echo "Value : ${array[$x]} "; 

done 

echo "final value: $contador" 

alors, l'erreur sur le terminal après l'exécution du script est

error

+1

Pouvez-vous simplifier cela à un [mcve]? Vous pouvez probablement obtenir la même erreur à partir d'une seule ligne de code qui ne fait qu'appeler 'bc'. –

+0

Envisagez d'utiliser 'bash -x yourscript' pour consigner tout ce que fait le script, pour trouver l'endroit où il se trompe d'abord. Si vous voulez que le suivi soit un peu plus facile, vous pouvez attribuer une valeur à 'PS4' qui comprend le numéro de ligne; par exemple, tous sur une ligne, vous pouvez exécuter: 'PS4 = ': $ {LINENO} +' bash -x votre script'. (Notez que pour des raisons de sécurité, 'PS4' doit être défini dans votre script lui-même dans de très nouvelles versions de bash si ce script est exécuté en tant que root). –

+0

BTW, s'il vous plaît ajouter les journaux ci-dessus demandé comme texte à la question, pas de captures d'écran. Voir la réponse acceptée à [Pourquoi ne pas télécharger des images de code sur SO lorsque vous posez une question?] (Https://meta.stackoverflow.com/a/285557/14122) –

Répondre

0

La question est votre dernière ligne ne dispose pas d'un saut de ligne en elle, quand canalisé vers la Colombie-Britannique.

Cela fonctionne très bien.

$ echo "scale=4; 2046/1024" | bc 
1.9980 
$ echo -e "scale=4; 2046/1024\n" | bc 
1.9980 

Ceci est cassé

$ echo -n "scale=4; 2046/1024" | bc 
(standard_in) 1: syntax error 

Je pense que vous pouvez changer à

contador=$(echo -e "scale=4; $contador+$paraulao\n" | bc) 

Cela devrait corriger. En outre, indentez et ajoutez des commentaires.

+0

L'option '-e' est inutile (je * espère * qu'il n'y a aucun caractère échappé dans ce qui devrait être un nombre). – chepner

+0

@chepner le '-e' est nécessaire pour le \ n. – SaintHax

+0

Pourquoi utiliser l'option non standard '-e' pour supprimer le saut de ligne implicite uniquement pour l'ajouter explicitement? – chepner