2016-03-18 2 views
-1

Привет Я создаю систему архивации в bash с длинным и беспорядочным оператором if, который в настоящее время не работает с текущими ошибками, находящимися в последних нескольких строках с инструкцией else if. Хотя я ожидаю, что в этом случае есть и другие ошибки. Выбор переменной - это меню, которое отображается в терминале. Поэтому, если они выбирают вариант 1, пользователь должен ввести данные, которые будут записаны в файл crontab.Почему мое заявление If в Bash не работает?

if [ $choice -eq "1" ] then 
echo "Enter the MINUTE" 
read minute 

    if [ $minute -eq 0 ] then 
     GLOBIGNORE=* 
     minute="*" 
     echo minute 
    fi 

echo "Enter the Hour" 
read hour 

    if [ $hour -eq 0 ] then 
     GLOBIGNORE=* 
     hour="*" 
     echo hour 
    fi 

echo "Enter the Day" 
read day 

    if [ $day -eq 0 ] then 
     GLOBIGNORE=* 
     day="*" 
     echo day 
    fi 

echo "Enter the Month" 
read month 

    if [ $month -eq 0 ] then 
     GLOBIGNORE=* 
     month="*" 
     echo month 
    fi 

echo "Enter the weekday" 
read weekday 

    if [ $weekday -eq 0 ] then 
     GLOBIGNORE=* 
     weekday="*" 
     echo weekday 
    fi 


echo $minute $hour $day $month $weekday " date > ~/testcron.log" > testcron.txt fi 
elif [ $choice -eq "2" ] 
then 
    echo "Enter the Source and Destination Locations" 
fi 
+0

Пожалуйста, исправить отступ. Это должно помочь вам распознать структуру кода, например. который 'fi' принадлежит к' if'. – choroba

+1

Опубликовать все заявление (я вижу несколько 'if'', но только один 'fi'). –

+0

bash не питон. отступы не влияют на порядок операций. NONE ваших операторов if имеет завершающий 'fi', поэтому у вас есть одна серия глубоко вложенных операторов' if'. –

ответ

0

Есть несколько проблем с вашим кодом:

if [ $hour -eq 0 ] then 
    GLOBIGNORE=* 
    hour="*" 
    echo hour 
fi 

В целом (все испытания []) являются отсутствует ; после этого:

if [ $hour -eq 0 ]; then 

Эхо-час не будет печатать значение var hour, кроме слова hour. Перейдите на страницу echo "$hour" (да, процитировано). Кроме того, нет необходимости устанавливать переменную GLOBIGNORE в *, если vars правильно процитированы.

В вары здесь не котируется, что является причиной его неисправности (или нужно GLOBIGNORE):

echo $minute $hour $day $month $weekday 

Изменить на:

echo "$minute $hour $day $month $weekday" 

Перенаправление на той же линии простой >, который будет пустым файл.
Если вы хотите добавить к файлам, сделайте это:

echo "$minute $hour $day $month $weekday" "$(date >> ~/testcron.log)" >>testcron.txt 

В этой строке есть ненужный дополнительный фи

Этот сценарий может быть полезен:

get(){ 
    read -p "$1" "$2" 
    if [ "$((${!2}))" -eq 0 ]; then 
     eval "$2"="*" 
     echo "${!2}" 
    fi 
} 

read -p "Choice?:" choice 

if [ "$choice" -eq "1" ]; then 
    get "Enter the MINUTE" minute 
    get "Enter the Hour" hour 
    get "Enter the Day"  day 
    get "Enter the Month" month 
    get "Enter the weekday" weekday 
    date >> ~/testcron.log 
    echo "$minute $hour $day $month $weekday" >> testcron.txt 
elif [ "$choice" -eq "2" ]; then 
    echo "Enter the Source and Destination Locations" 
fi 
0

У вас не хватает запятой:

if [ $choice -eq "1" ]; then 

или

if [ $choice -eq "1" ] 
then 

Точка с запятой или символом новой строки требуется, поскольку команда фактически [ и должен прекращается после ], что является последним аргументом, данным [.

Это старый test (или [) синтаксис, можно также использовать:

if ((choice == 1)) 
then 
Смежные вопросы