2016-12-08 4 views
-1

Я написал сценарий для очистки активности, основанный на определенном дате. Но я получаю сообщение об ошибке.Bash - синтаксическая ошибка: неожиданный конец файла

#!/bin/bash 
echo "Process Started" 
Current_Date=`date +%Y-%m-%d` 
echo "todays Date ==> $Current_Date" 
fromDate=$1 
toDate=$2 
oldDate=`date --date="3 years ago" +%Y-%m-%d` 
echo "Two Yrs Back Date ==> $oldDate" 
if [ $toDate -le $oldDate ] 
then 
find . -type f -newermt $fromDate ! -newermt $toDate -exec truncate -s 0 {} \; && echo "truncated" 
else 
echo "todate should be less than three years" 
fi 
echo "Done" 

Получение ошибки - line 15: syntax error: unexpected end of file Хотя строка 15 не существует скрипт имеет только 14 строчку. Также скрипт bash работает нормально до команды echo "Two Yrs Back Date ==> $oldDate". После этого он выдает ошибку, когда начинается условие if. Просто хотел проверить любую синтаксическую ошибку, которую я делаю.

+1

Все ваши вары. – 123

+0

скрипты bash работают нормально до команды 'echo 'Two Yrs Back Date ==> $ oldDate" После этого он выдает ошибку при запуске условия if. – Sam

+0

Что говорит 'bash -n yourscpript'? Любые забавные символы (\ r вместо \ n), когда вы делаете 'od -c yourscript'? – Jens

ответ

-1

Оператор -le предназначен для сравнения целых чисел, а не для строк.

Попробуйте

if [[ "$toDate" < "$oldDate" ]] 

для строги менее чем или

if [[ "$toDate" < "$oldDate" ]] || [[ "$toDate" = "$oldDate" ]] 

меньше или равно.

(см http://www.tldp.org/LDP/abs/html/comparison-ops.html)

+0

Это не устраняет синтаксическую ошибку. Кроме того, POSIX не указывает '<' как оператор для '[', поэтому вы можете использовать '[[$ toDate <$ oldDate]]', потому что вы уже полагаетесь на 'bash', реализуя <'. Кроме того, '-o' считается устаревшим; вы должны использовать две команды, связанные с '||' вместо: '[...] || [...] '. – chepner

0

Используйте это:

#!/bin/bash 

echo "Process Started" 
Current_Date=$(date +%Y-%m-%d) 
echo "todays Date ==> $Current_Date" 

fromDate=$1 
toDate=$2 
oldDate=$(date --date="3 years ago" +%Y-%m-%d) 
echo "Two Yrs Back Date ==> $oldDate" 

if [[ "$toDate" < "$oldDate" ]] || [[ "$toDate" = "$oldDate" ]]; then 
    find . -type f -newermt "$fromDate" ! -newermt "$toDate" -exec truncate -s 0 {} \; && echo "truncated" 
else 
    echo "todate should be less than three years" 
fi 
echo "Done" 

Вы можете сравнить lexicographically с условной конструкцией [[]]. Для сравнения дат в Баш вам нужно использовать:

[[ expression ]] 
Return a status of 0 or 1 depending on the evaluation of the conditional expression expression

Выдержки из whoan ответа на this post

чист предупреждений с помощью shellcheck инструмента. И не забудьте процитировать варсы, чтобы избежать проблем! shellcheck показывает такие вещи, как это: ^-- SC2053: Quote the rhs of = in [[ ]] to prevent glob matching

1

У вас есть довольно много расширений, которые нуждаются в кавычки:

if [ "$toDate" -le "$oldDate" ] 

find . -type f -newermt "$fromDate" ! -newermt "$toDate" 

, не видя, как вы запустили сценарий, это трудно понять, являются ли они вносят свой вклад в вашу проблему, но они должны быть исправлены в любом случае.

Вы можете найти это помогает быть последовательным и процитировать переменные для задания, тоже:

fromDate="$1" 
toDate="$2" 

Ваш сценарий также не в строке 9, как -le требует целое - вы, вероятно, имел в виду, чтобы дать date формат строка, такая как +%s, чтобы получить сопоставимые целые числа.

В качестве альтернативы, пожалуйста, не вводите в код примера деструктивные команды, такие как truncate - он должен быть достаточным только для echo или чего-то другого.

+0

Назначения не обязательно должны цитироваться, хотя это, конечно, не больно. –

+1

Спасибо @BenjaminW - Я всегда цитировал мой и не понимал, что там не требуется. Ответ обновлен. –

Смежные вопросы