Bash конкретный ответ
Так как я люблю уменьшать количество вилок и bash, я допускаю много хитростей, поэтому у меня есть цель:
todate=2013-07-18
cond=2013-07-15
Ну теперь:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Это позволит заново заполнить обе переменные $todate
и $cond
, используя только одну разветвленную ветвь, с выходом, который date -f -
берет stdio для чтения одной даты построчно.
Наконец, вы можете разорвать ваш цикл с
((todate>=cond))&&break
Или как функция :
myfunc() {
local todate cond
{ read todate
read cond
} < <(
date -f - +%s <<<"$1"$'\n'"$2"
)
((todate>=cond))&&return
printf "%(%a %d %b %Y)T older than %(%a %d %b %Y)T...\n" $todate $cond
}
Использование встроенной функции bash , printf
которая может отображать дату и время с секундами от эпохи (см . man bash
;-)
Этот скрипт использует только один форк.
Альтернатива с ограниченными вилками и функцией чтения даты
Это создаст выделенный подпроцесс (только один форк):
mkfifo /tmp/fifo
exec 99> >(exec stdbuf -i 0 -o 0 date -f - +%s >/tmp/fifo 2>&1)
exec 98</tmp/fifo
rm /tmp/fifo
Поскольку вход и выход открыты, запись fifo может быть удалена.
Функция:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Замечание Для предотвращения таких бесполезных форков, как todate=$(myDate 2013-07-18)
переменная, должна быть установлена самой функцией. И чтобы разрешить свободный синтаксис (с или без кавычек для строки даты), имя переменной должно быть последним аргументом.
Тогда сравнение даты:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
может сделать:
To: Thu Jul 18 00:00:00 2013 > Cond: Mon Jul 15 00:00:00 2013
bash: break: only meaningful in a `for', `while', or `until' loop
если вне петли.
Или используйте функцию оболочки bash:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
или же
wget https://f-hauri.ch/vrac/shell_connector.sh
(Которые не совсем такие же: .sh
содержат полный сценарий тестирования, если не получены)
source shell_connector.sh
newConnector /bin/date '-f - +%s' @0 0
myDate 2013-07-18 todate
myDate "Mon Jul 15 2013" cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}