>
-Sign представляет собой I / O-перенаправление . С > stat.txt
Вы перенаправляете стандартный выход (STDOUT) приложения к файлу stat.txt
. Он перенаправлен, поэтому вы не увидите вывод в оболочке.
Если вы хотите вывод в текущей оболочке и файловой трубе вывод в Tee
:
your_command | tee stat.txt
или ..
your_command | tee -a stat.txt
.. Чтобы добавить в файл.
Ваше приложение также может создавать некоторые ошибки. В основном они происходят в стандартной ошибке (см. стандартные потоки ). Чтобы перенаправить, что поток используйте синтаксис фольтана:
your_command 2>error.log
Без маркеров регулярное выражение (правая часть) может соответствовать любой части строки. Итак, ваш вариант соответствует 1234
.
Чтобы удовлетворить требования, вы должны использовать маркеры:
[[ "1234+5678" =~ ^[0-9]+(\s*(\-|\*)\s*[0-9]+)*$ ]] ; echo $?
И короче (если хотите):
[[ "1234+5678" =~ ^[0-9\ *-]+*$ ]] ; echo $?
Ваше выражение возвращает 0, потому что оно соответствует первому числу. Прикрепите регулярное выражение, чтобы оно выполняло то, что вы хотите:
[[ "1234+5678" =~ ^[0-9]+( *(-|\*) *[0-9]+)*$ ]] && echo $?
Попутно: (1) вам не нужно цитировать -
, и (2) \ s
- это не признан ERE.
[[ "1234+5678" =~ [0-9]+(\s*(\-|\*)\s*[0-9]+) ]] ; echo $?
Оператор регулярного выражения *
в конце вашего регулярного выражения допускает любое количество повторов выражения внутри (), также ни одного. Таким образом, вы сопоставляете [0-9] + с самого начала, а остальное необязательно.
Если удалить *
или заменить его на +
, выражение вернется, как ожидалось.
Кроме того, звездочка после выражения в круглых скобках означает, что от 2-й до n-й пары оператор-номер является необязательной.
Это ошибка: *
означает, что любой оператор является опцией. Используйте оператор +
!
Хорошо, это был не ответ, но вы можете использовать выражения и посмотреть, пуст ли результат:
echo "1234*5678"|sed 's/[0-9]\+\([ \*\-][0-9]\+\)*//'