Преобразуйте сценарий жемчуга для избиения

Посмотрите на вывод, не передавая по каналу к 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 просто производит еще некоторый вывод.

0
23.12.2013, 19:34
2 ответа
  1. необходимо заключить метасимволы шаблона имени файла в кавычки как * и [

    timestamp='^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9]'
    except='.*Exception.*'
    
  2. test команда (иначе известный как [[) воздействует на количество аргументов, которые оно получает. Это поэтому очень чувствительно к пробелу:

        if [[ $exception = false ]]
    
  3. существует главная логическая ошибка: Вы сбрасываете block переменная в [[ -z $block ]] блок: однажды block является ненулевым, это никогда не может сбрасываться.

  4. Почему Вы переписываете рабочий сценарий?

2
28.01.2020, 02:37

Править: следующее решение ближе к исходному сценарию, чем, что я первоначально записал (это проверяет целое тело блока, не только первую строку, для слова "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
0
28.01.2020, 02:37
  • 1
    Вы являетесь лучшими, хорошо работает, но я не понимаю блок [], (*). Не может понять, как это проверяет целое тело блока и как блок определяется. –  C Ts 02.01.2014, 18:18
  • 2
    @CTs [[ ${block[*]} = *Exception* ]] проверяет целое тело блока. block массив, каждый объект массива является строкой. –  mirabilos 02.01.2014, 21:47
  • 3
    В цикле с условием продолжения Вы вставляете каждую строку в массиве (блок + = (" $line"))? Что (*) в цикле с условием продолжения? В newblock методе, блок = (" $line"), что точно делает? Извините за все вопросы, но я являюсь новым в ударе, и в первый раз сталкивается с массивом! –  C Ts 03.01.2014, 11:55
  • 4
    (*) принадлежит case и, в основном, эквивалент default оператор в C switch. И x+=(y) добавляет к массиву x, в то время как x=(y) устанавливает массив x пустой прежде, чем добавить y. –  mirabilos 03.01.2014, 13:22

Теги

Похожие вопросы