Как я могу повторить значение [ 4 -gt 3 ], которое является проверочным выражением в bash?

Этот ответ предлагается после того, как решение было найдено в комментариях.

Проблемы, которые необходимо решить::

  1. Ясность

    Первоначально не было ясно, какие файлы конфигурации предназначены для системы CentOS (нет ), а какие для Pi (некоторые ). Более поздние обновления вопроса прекрасно прояснили это.

  2. Сервер CentOS изначально не был синхронизирован со своими вышестоящими серверами.

    Это занимает несколько итераций интервала опроса, и в идеале доступность по крайней мере одного сервера должна быть 377. Это восьмеричное представление битового поля, которое показывает количество последних успешных запросов. Каждый интервал помещает 1или 0на младший значащий конец битового поля. 377соответствует 11-111-111.

  3. Pi не удалось синхронизироваться с вышестоящим сервером CentOS

    Брандмауэр iptablesна сервере CentOS не был виноват, но его нужно было настроить так, чтобы он разрешал входящие UDP-запросы от Pi к порту 123 и возвращал соответствующие ответы-firewall-cmd --permanent --add-service ntp.Он также должен был разрешить исходящие запросы к вышестоящим серверам на UDP/123 и их соответствующие ответы. Использование серверов из пула NTP немного усложняет эту задачу, поскольку IP-адреса серверов включаются в пул и из него ежечасно. Одним из вариантов здесь было бы разрешить весь исходящий трафик по UDP/123 и совпадающие ответы.

    Выяснилось, что систему CentOS защищал аппаратный брандмауэр, и он не был настроен на разрешение NTP-трафика от Pi.

0
24.03.2019, 13:08
2 ответа

Ваши команды не работают так, как вы ожидаете, потому что тест ничего не выводит в свой стандартный поток вывода. Это стандартный поток вывода, который передается следующей команде в конвейере (ваша первая команда ), и это стандартный вывод, который заменяет подстановку команд (вашу вторую команду ).

Кстати, обратите внимание, что даже если левая часть вашего первого конвейера выдает что-то в своем стандартном потоке вывода, echoсправа этого не отобразит. Утилита echoне читает со своего стандартного ввода (, но, например. catделает ).


Любая команда оболочки возвращает статус выхода. Этот статус выхода - это то, что, например. действует оператор if. Статус выхода никогда не выводится, например. терминал, иначе это будет мешать фактическому выводу команды или сценария.

При использовании

[ 3 -gt 4 ]

вы вызываете утилиту [с некоторыми аргументами. Эта утилита возвращает статус выхода. Это в точности эквивалентно

test 3 -gt 4

См. man testиman [(или help testв оболочке bash).

Статус выхода самой последней выполненной команды сохраняется в специальной переменной $?.

Вы можете сохранить это в обычной переменной или вывести на терминал:

[ 3 -gt 4 ]
printf 'Exit status of test was %s\n' "$?"
printf 'Exit status of printf was %s\n' "$?"

Обратите внимание, чтоprintfтакже создает свой собственный статус выхода, поэтому, если вызов printfпрошел нормально, значение $?будет равно нулю после вывода статуса теста.

Приведенный выше код, скорее всего, выведет

Exit status of test was 1
Exit status of printf was 0

Обратите внимание, что сам тест здесь никогда ничего не выводит. Он просто предоставляет статус выхода.

5
28.01.2020, 02:16

Только это:

[ 5 -gt 4 ]
echo $?
0
28.01.2020, 02:16

Теги

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