В сценарии удара я хочу проверить, является ли это первый день месяца. Теперь я имею:
if [ $DAY -eq 1 ]; then
rclone copy /tmp/$MONTH-$YEAR.tar.gz.gpg /server2/archive
fi
и я получаю ошибку:
[: -eq: unary operator expected
Я попробовал много различных синтаксисов от сети, но я не могу успешно выполниться. Какая-либо идея что не так? Сервер Ubuntu 18.04
Bash не предопределяет DAY
. Как [1 126] Jos говорит , сообщение об ошибке, которое Вы получаете, совпадает с сообщением, полученным, когда оно опущено в целом:
ek@Kip:~$ [ -eq 1 ]
-bash: [: -eq: unary operator expected
команда date +%d
производит текущий день месяца. Если Вы хотите DAY
держать то значение, можно использовать:
DAY="$(date +%d)"
, Но можно также просто поместить замена команды в эти [
команда:
if [ "$(date +%d)" -eq 1 ]; then
rclone copy "/tmp/$MONTH-$YEAR.tar.gz.gpg" /server2/archive
fi
date +%d
всегда выводы две цифры, поэтому когда это - первый день месяца, это производит 01
, но это не проблема. Арифметически, 01
равно [1 111], и Вы справедливо используете -eq
, который выполняет числовое сравнение (в отличие от этого =
, который выполняет текстовое сравнение).
Вы заметите, что я имею , включил $(date +%d)
в [1 129] двойные кавычки в эти [
команда. Это предотвращает globbing и слово, разделяющее .
Это - хорошая идея всегда для включения расширение параметра ("$DAY"
), арифметическое расширение ("$((3 + 4))"
), и замена команды ("$(date +%d)"
или менее предпочтительная форма `date +%d`
) в [1 136] двойные кавычки кроме довольно редкого случая, что Вы на самом деле хотите globbing и разделение слова быть выполненными.
, Если бы Вы записали "$DAY"
первоначально, вместо [1 121], затем Вы получили бы эту ошибку от [1 122]:
-bash: [: : integer expression expected
, Что ошибка имеет намного больше смысла.
я также включил Ваш путь, /tmp/$MONTH-$YEAR.tar.gz.gpg
, который содержит расширения параметра $MONTH
и $YEAR
в двойных кавычках.