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?
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
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
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.
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.
Essayez [[test_expression]]; au lieu de [expression_test];