Это проверяет каждый файл в текущем каталоге с помощью оператора bash [[
на соответствие шаблону:
^
-
-
.pdf
$
Вы можете достаточно легко скорректировать приведенные выше допущения.
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
В системах 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
По соглашению 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)
Оболочка не C
. В C
0 ложно, все остальное верно. В оболочке 0 — это правда/успех, все остальное — ложь. Это потому, что есть много способов потерпеть неудачу, но один способ добиться успеха.
Конкретно с информационной страницы test.
Exit status:
0 if the expression is true,
1 if the expression is false,
2 if an error occurred.