web-dev-qa-db-fra.com

Commande à l'intérieur de l'instruction if du script bash

J'ai la ligne suivante dans le cadre d'un script bash beaucoup plus grand:

if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^  *//g'` -eq 1 ] 

lors de l'exécution du script, j'obtiens:

./install.sh: ligne 219: [: -eq: opérateur unaire attendu

Où la ligne 219 est la ligne ci-dessus. Des suggestions pour un correctif?

21
myahya

Cela se produit lorsque vous utilisez la fonction intégrée test via [ Et que votre expression de gauche renvoie NUL. Vous pouvez résoudre ce problème en utilisant:

if [ x`some | expression | here` = x1 ]; then

Ou, puisque vous utilisez déjà bash, vous pouvez utiliser sa syntaxe (( )) Beaucoup plus agréable qui n'a pas ce problème et faire:

if (( $(some | expression | here) == 1 )); then

Notez que j'ai également utilisé $() pour la substitution de commandes sur les backticks `` car ce dernier est non-POSIX et obsolète

30
SiegeX

Vous pouvez exécuter votre commande sans syntaxe supplémentaire. Par exemple, ce qui suit vérifie le code de sortie de grep pour déterminer si l'expression régulière correspond ou non:

if ! grep -q "$Word" /usr/share/dict/words
then
    echo "Word $Word is not valid Word!"
fi
26
Alex Spurling

L'erreur se produit parce que votre substitution de commande ne renvoie rien, ce qui donne à votre test l'apparence suivante:

if [ -eq 1 ] 

Une façon courante de résoudre ce problème consiste à ajouter une constante des deux côtés de l'équation, de sorte qu'aucun opérande ne devienne vide à tout moment:

if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^  *//g'` = x1 ] 

Notez que = est utilisé car nous comparons maintenant des chaînes.

8
codaddict

Vous pouvez ajouter un "x" des deux côtés de la comparaison ou vous pouvez simplement citer le côté gauche:

[ "$(command | pipeline)" = 1 ]

Je ne comprends pas à quoi servent les cut et sed à la fin. La sortie de wc -l dans un pipeline est simplement un nombre.

6
Dennis Williamson

Essayez [[test_expression]]; au lieu de [expression_test];

5
SOUser