Команда внутри 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 является строкой выше. Любые предложения по исправлению?
Ответы
Ответ 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
в конвейере - просто число.