Подтвердить что ты не робот

Команда внутри if-оператора bash script

У меня есть следующая строка как часть гораздо большего bash script:

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

при запуске script, я получаю:

./install.sh: строка 219: [: -eq: ожидаемый ожидаемый оператор

Если строка 219 является строкой выше. Любые предложения по исправлению?

4b9b3361

Ответ 1

Это происходит, когда вы используете встроенный test через [, а ваше левое выражение возвращает NUL. Вы можете исправить это, используя:

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

Или, поскольку вы уже используете bash, вы можете использовать его гораздо более приятный синтаксис (( )), который не имеет этой проблемы и делает:

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

Обратите внимание, что я также использовал $() для подстановки команды по обратным выводам ``, ​​поскольку последний является не-POSIX и устарел

Ответ 2

Вы можете запустить свою команду без дополнительного синтаксиса. Например, следующее проверит код выхода grep, чтобы определить, соответствует ли регулярное выражение или нет:

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

Ответ 3

Ошибка возникает из-за того, что ваша подстановка команд ничего не возвращает, что делает ваш тест похожим:

if [ -eq 1 ] 

Общим способом исправить это является добавление некоторой константы по обеим сторонам уравнения, так что никакой операнд не станет пустым в любое время:

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

Обратите внимание, что = используется, поскольку мы теперь сравниваем строки.

Ответ 4

Попробуйте [[test_expression]]; вместо [test_expression];

Ответ 5

Вы можете добавить "x" к обеим сторонам сравнения или просто процитировать левую сторону:

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

Я не понимаю, для чего предназначены cut и sed. Вывод wc -l в конвейере - просто число.