Посмотрите на вывод, не передавая по каналу к wc
видеть различие
$ ls -R www | cat
www:
dir1
dir2
file1
www/dir1:
file1
www/dir2:
file1
file2
$ ls -R www | wc -l
11
И
$ tar xvfz www.tar.gz
www/
www/dir1/
www/dir1/file1
www/dir2/
www/dir2/file1
www/dir2/file2
www/file1
$ tar xvfz www.tar.gz |wc -l
7
ls -R
просто производит еще некоторый вывод.
необходимо заключить метасимволы шаблона имени файла в кавычки как *
и [
timestamp='^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9]'
except='.*Exception.*'
test
команда (иначе известный как [[
) воздействует на количество аргументов, которые оно получает. Это поэтому очень чувствительно к пробелу:
if [[ $exception = false ]]
существует главная логическая ошибка: Вы сбрасываете block
переменная в [[ -z $block ]]
блок: однажды block
является ненулевым, это никогда не может сбрасываться.
Почему Вы переписываете рабочий сценарий?
Править: следующее решение ближе к исходному сценарию, чем, что я первоначально записал (это проверяет целое тело блока, не только первую строку, для слова "Exception"):
block=()
newblock() {
[[ ${block[*]} = *Exception* ]] && printf '%s\n' '' '' '***EXCEPTION***' "${block[@]}"
block=("$line")
}
while IFS= read -r line; do
case $line in
([0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9]\ *)
newblock
;;
(*)
block+=("$line")
;;
esac
done
newblock
[[ ${block[*]} = *Exception* ]]
проверяет целое тело блока. block
массив, каждый объект массива является строкой.
– mirabilos
02.01.2014, 21:47
(*)
принадлежит case
и, в основном, эквивалент default
оператор в C switch
. И x+=(y)
добавляет к массиву x, в то время как x=(y)
устанавливает массив x пустой прежде, чем добавить y.
– mirabilos
03.01.2014, 13:22