У меня есть вопрос, если еще, но я не уверен, что ответ верен?

Это проверяет каждый файл в текущем каталоге с помощью оператора bash [[на соответствие шаблону:

  • начало строки^
  • 3 цифры
  • -
  • 8 цифр
  • -
  • 9 цифр
  • .pdf
  • конец строки$
  • что средние 8 цифр оцениваются как действительная дата в соответствии с датой GNU

Вы можете достаточно легко скорректировать приведенные выше допущения.

for f in *
do
  [[ $f =~ ^([0-9][0-9][0-9])-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]).pdf$ ]] && 
  date -d ${BASH_REMATCH[2]} &>/dev/null && 
  echo Valid: "$f"
done
0
16.06.2019, 21:17
3 ответа

В системах Unix утилиты возвращают нулевой статус выхода -, если то, что они сделали, прошло успешно, если оно завершилось успешно без ошибок и т. д. Если утилита терпит неудачу, она возвращает не -нулевой статус выхода.

Таким образом, можно сообщить пользователю с выходным статусом -, что если он не прав (, см., например,. "ВЫХОДНЫЕ ЗНАЧЕНИЯ" или аналогичный раздел некоторых руководств, например руководствоrsync). Короче говоря, если операция прошла успешно, статус выхода -равен нулю, а если он не равен нулю, то она не удалась, а статус выхода -может сказать, почему она не удалась.

Утилита test, которую вы используете, следует этому образцу в том смысле, что если сравнение успешно (является "истинным" ), оно возвращает ноль. Если сравнение (или какая-либо другая операция, которую оно выполняет ), завершается ошибкой (, это «ложь» ), оно возвращает не -нулевой статус выхода -.

Ключевое слово ifпринимает утилиту и действует на ее статус выхода -. Если утилита возвращает нулевой статус выхода -, она использует ветку по умолчанию, в противном случае — ветку else:

.
if test 4 -eq 3; then
    echo 4 is 3
else
    echo 4 is not 3
fi

ifможно взять любую утилиту:

if grep -q 'secret' file.txt; then
    echo file.txt contains secret
else
    echo file.txt does not contain secret
fi
if mkdir mydir; then
    echo created directory mydir
else
    echo failed to create directory mydir
fi
4
28.01.2020, 02:14

По соглашению 0означает, что операция прошла успешно, а все, кроме 0, является ошибкой. Итак, если $?равно 0, то тест прошел успешно, а если это не 0, например, если это 1, то тест не пройден.

Возможно, вы сможете увидеть это немного яснее, если запустите:

$ number=4
$ if test $number -eq 4; then echo "YES ($?)"; else echo "NO ($?)"; fi
YES (0)
$ if test $number -lt 2; then echo "YES ($?)"; else echo "NO ($?)"; fi
NO (1)
3
28.01.2020, 02:14

Оболочка не C. В C0 ложно, все остальное верно. В оболочке 0 — это правда/успех, все остальное — ложь. Это потому, что есть много способов потерпеть неудачу, но один способ добиться успеха.

Конкретно с информационной страницы test.

Exit status:

 0 if the expression is true,
 1 if the expression is false,
 2 if an error occurred.
0
28.01.2020, 02:14

Теги

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