Скрипт Bash получает одинаковый существующий статус для разных результатов - PullRequest
0 голосов
/ 06 июля 2019

Мой скрипт ищет файл, grep шаблон и, если он совпадает, копирует файл в папку назначения.Я делаю это, используя трубу, как вы можете видеть.Вся команда работает правильно, но я не могу проверить ее, потому что я получаю одинаковое состояние завершения независимо от того, найден файл или нет.Чтобы проиллюстрировать это, ниже у меня есть два примера.Во-первых, я нашел файл и открыл файл.Обратите внимание на статус выхода напечатан.Во втором примере я не нашел и не нашел файл, однако статус выхода такой же.Что я могу сделать, чтобы правильно проверить эту команду?

  1. Файл существует.

    find $HOME -type f -name arq_*.txt | xargs -n1 -I{} grep -l 00819047 {}  | xargs -n1 -I{} cp -v {} $HOME/aka 
    
    `/home/fabrifb/arq_144.txt' -> `/home/fabrifb/aka/arq_144.txt'
    
    echo "0)${PIPESTATUS[0]} 1)${PIPESTATUS [1]} : 2)${PIPWSTATUS[2]} ?)$? @)${PIPESTATUS[@]}"
    

    Результат:

    0)0 1)0 : 2) ?)0 @)0 0 0
    
  2. Не существует

    find $HOME -type f -name arqX_*.txt | xargs -n1 -I{} grep -l X00819047 {}  | xargs -n1 -I{} cp -v {} $HOME/aka
    
    echo "0)${PIPESTATUS[0]} 1)${PIPESTATUS [1]} : 2)${PIPWSTATUS[2]} ?)$? @)${PIPESTATUS[@]}"
    

    Результат

    0)0 1)0 : 2) ?)0 @)0 0 0
    

Я ожидаю, что смогу различить обе ситуации, чтобы я мог предупредить пользователя, когда файл не существует.

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Команда find возвращает 0 (успех), если не было ошибки, команда find не возвращает ошибку, если файлы не соответствуют вашему аргументу.

находить выходы со статусом 0, если все файлы успешно обработаны, больше 0, если возникают ошибки.

Вы, вероятно, должны использовать условное утверждение, чтобы проверить, найден ли файл, соответствующий шаблону.

if [ $(find $HOME -type f -name arq_*.txt) -gt 0 ]
then
   echo "no matching file found"
else
   echo "files found"
fi
0 голосов
/ 07 июля 2019

find возвращает ноль, если не находит файлов. grep возвращает 1, но никогда не получает никаких имен файлов, потому что он заключен в xargs, который снова возвращает 0 для пустого ввода. Если вы хотите проверить, существуют ли файлы, вы можете использовать массивы:

shopt -s nullglob
files=(arq_*.txt)
if [[ "${#files[@]}" -eq 0 ]]
then
    [handle non-existing files]
fi
for file in "${files[@]}"
do
    if grep 00819047 "$file"
    then
        cp "$file" $HOME/aka
    fi
done

или переменная защиты:

found=0
for file in arg_*.txt
do
    found=1
    [loop contents like above]
done
if [[ "$found" -eq 0 ]]
then
    [handle non-existing files]
fi

У вас также есть орфографическая ошибка PIPWSTATUS. Но в любом случае ${PIPESTATUS[@]}" - это все, что вам нужно напечатать, чтобы получить полное содержимое этого массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...