Использование теста и даты для сравнения текущего часового диапазона ro

Вы установили chroot_local_userна YES, и на изображении FTP-сервер пытается открыть /var/www/....-, это каталог локальных пользователей home?

1
17.12.2020, 20:17
2 ответа

Вы присваиваете литеральную строку date +%Hпеременной hour.

Чтобы запустить эту команду dateи назначить ее вывод на hour, используйте подстановку команд:

hour=$(date +%H)

В качестве альтернативы, с последним выпуском оболочки bash(4.2+ ),

printf -v hour '%(%H)T' -1

сделает то же самое, вообще не используя date.

Кроме того, вам нужно fiпойти с этим ifи использовать&&("и" )вместо||("или" ), чтобы получить правильную логику:

if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
    echo 'Good afternoon'
fi

Я использую стандартный тест [... ], а не собственный тест [[... ]]оболочки bash, чтобы избежать проблем с интерпретацией (значений $hourв арифметическом контексте, представленном -geи -ltпроверяет )как недопустимые восьмеричные числа(08и09).

Если вы считаете, что вам нужно использовать [[... ]], вы можете протестировать ${hour#0}вместо немодифицированного значения $hour, чтобы избежать проблем. Значение ${hour#0}будет таким же, как $hour, но с удаленным одиночным ведущим 0.

if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
    echo 'Good afternoon'
fi
4
18.03.2021, 22:42

Bash также поддерживает синтаксис ((...))для арифметических операций. Ваш код можно переписать как:

#!/bin/bash

declare -i hour=$(date +%k)
if (( hour > 12 && hour < 19 ))
then
    printf "Good afternoon\n"
fi

Строка declare -i hour=$(date +%k)указывает, что переменная hourдолжна рассматриваться как арифметическое целое число, и присваивает ей текущий час (0 -23 )без нуля в начале.

0
18.03.2021, 22:42

Теги

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