Ошибки сценариев оболочки Bash: ./myDemo: 56: синтаксическая ошибка: неопределенная строка в кавычках - PullRequest
1 голос
/ 07 декабря 2009

Может ли кто-нибудь взглянуть на этот код и выяснить, что с ним не так?

#!/bin/sh
while :
do
    echo " Select one of the following options:"
    echo " d or D) Display today's date and time"
    echo " l or L) List the contents of the present working directory"
    echo " w or W) See who is logged in"
    echo " p or P) Print the present working directory"
    echo " a or A) List the contents of a specified directory"
    echo " b or B) Create a backup copy of an ordinary file"
    echo " q or Q) Quit this program"
    echo " Enter your option and hit <Enter>: \c"
    read option 
    case "$option" in
        d|D) date
             ;;
        l|L) ls $PWD
             ;;
        w|w) who
                 ;;
        p|P) pwd
             ;;
        a|A) echo "Please specify the directory and hit <Enter>: \c"
             read directory
                    if [ "$directory = "q" -o "Q" ]
                then
                    exit 0
                fi

                while [ ! -d "$directory" ]
                do
                        echo "Usage: "$directory" must be a directory."
                    echo "Re-enter the directory and hit <Enter>: \c"
                    read directory

                        if [ "$directory" = "q" -o "Q" ]
                        then    
                            exit 0

                        fi

                done
                    printf ls "$directory"

            ;;  
            b|B) echo "Please specify the ordinary file for backup and hit <Enter>: \c"
             read file
                if [ "$file" = "q" -o "Q" ]
                then
                    exit 0
                fi     

                while [ ! -f "$file" ]
                do
                    echo "Usage: \"$file\" must be an ordinary file."
                    echo "Re-enter the ordinary file for backup and hit <Enter>: \c"
                    read file
                        if [ "$file" = "q" -o "Q" ]
                        then
                            exit 0
                        fi              
                done
                    cp "$file" "$file.bkup"
                 ;;

        q|Q) exit 0
             ;;

    esac
    echo
done
exit 0

Есть некоторые синтаксические ошибки, которые я не могу выяснить. Однако я должен отметить, что в этой системе Unix echo -e не работает (не спрашивайте меня, почему я не знаю, и у меня нет каких-либо разрешений, чтобы изменить его, и даже если мне не позволят в)

Ошибка сценария Bash Shell: "./myDemo ./myDemo: строка 62: синтаксическая ошибка рядом с неожиданным токеном done' ./myDemo: line 62:" [Отредактировано]

РЕДАКТИРОВАТЬ: Я исправил ошибку оператора while, однако теперь, когда я запускаю Сценарий некоторые вещи до сих пор не работает правильно.

  1. Кажется, что в b | B) оператор switch

    cp $ file $ file.bkup нет на самом деле скопировать файл в file.bkup?

  2. В операторе переключения a | A)

ls "$ directory" не распечатывает список каталогов для просмотра пользователем

#!/bin/bash
while $TRUE
do
        echo " Select one of the following options:"
        echo " d or D) Display today's date and time"
        echo " l or L) List the contents of the present working directory"
        echo " w or W) See who is logged in"
        echo " p or P) Print the present working directory"
        echo " a or A) List the contents of a specified directory"
        echo " b or B) Create a backup copy of an ordinary file"
        echo " q or Q) Quit this program"
        echo " Enter your option and hit <Enter>: \c"
        read option
        case "$option" in
                d|D) date
                     ;;
                l|L) ls pwd
                     ;;
                w|w) who
                     ;;
                p|P) pwd
                     ;;
                a|A) echo "Please specify the directory and hit <Enter>: \c"
                     read directory
                        if [ ! -d "$directory"  ]
                        then
                                while [ ! -d "$directory" ]
                                do
                                        echo "Usage: "$directory" must be a directory."
                                        echo "Specify the directory and hit <Enter>: \c"
                                        read directory

                                        if [ "$directory" = "q" -o "Q" ]
                                        then
                                        exit 0

                                        elif [ -d "$directory" ]
                                        then
                                                ls "$directory"

                                        else
                                        continue
                                        fi
                                done
                        fi
                        ;;
                b|B) echo "Specify the ordinary file for backup and hit <Enter>: \c"
                     read file
                        if [ ! -f "$file" ]
                         then
                                while [ ! -f "$file" ]
                                do 
                                        echo "Usage: "$file" must be an ordinary file."
                                        echo "Specify the ordinary file for backup and hit <Enter>: \c"
                                        read file
                                        if [ "$file" = "q" -o "Q" ]
then
                                        exit 0
                                        elif [ -f "$file" ]
                                        then
                                        cp $file $file.bkup
                                        fi
                                done
                        fi
                        ;;

                q|Q) exit 0
                     ;;

        esac
        echo
done
exit 0

Другое дело ... есть ли редактор, который я могу использовать для автоматического разбора кода? Т.е. чем-то похожим на NetBeans?

Ответы [ 4 ]

5 голосов
/ 07 декабря 2009

Вы пропускаете do после второго while. (Случай 'B'; сравните это с делом 'A' над ним.)

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


Что касается вашего измененного вопроса: Ваша логика нарушена в случаях A и B: вам нужно извлечь логику резервного копирования из вашего if / во время вложения ... if на самом деле ничего для вас не делает. Кроме того, не забудьте процитировать все ваши имена файлов, чтобы пробелы не нарушали ваш сценарий. Побег ваши вложенные цитаты. Я считаю, что вам нужно -e для эхо-операторов, которые используют \c.

Так что сделайте что-нибудь еще, как:

b|B) echo -e "Specify the ordinary file for backup and hit <Enter>: \c"
    read file
    while [ ! -f "$file" ]
    do 
        echo "Usage: \"$file\" must be an ordinary file."
        echo -e "Specify the ordinary file for backup and hit <Enter>: \c"
        read file
        if [ "$file" = "q" -o "$file" = "Q" ]
        then
            exit 0
        fi
    done
    cp "$file" "$file.bkup"
    ;;

Вам нужно будет сделать то же самое изменение для случая A.

3 голосов
/ 07 декабря 2009

Две проблемы в разделе списка каталогов A).

  1. Соединение -o не работает так, как вы думаете. Должно быть:

                if [ "$directory" = "q" -o "$directory" = "Q" ]
    
  2. Ваше внешнее «if» нуждается в «else» для обработки случая, когда данный каталог действительно является каталогом сразу.

Секция резервного копирования B) имеет те же две проблемы. Исправьте это, и обе опции команды будут работать.

2 голосов
/ 07 декабря 2009

В большинстве мест вы указали переменную $file, а в команде cp - нет. Должно быть:

cp "$file" "$file.bkup"

Некоторые из ваших echo команд имеют в конце "\ c". Я думаю, что это специфично для csh. Bash буквально повторяет символы "\" и "c".

Ваше утверждение while $TRUE работает в силу того, что переменная равна нулю или не установлена. Если ему присвоено какое-либо значение, он попытается выполнить содержимое как команду. Если вы хотите сделать этот тип бесконечного цикла, это обычно делается в Bash следующим образом:

while true

где true - встроенная оболочка. Или:

while :

где двоеточие не используется, и возвращает true. Конечно, есть и другие способы сделать то же самое.

В случае l|L) вы, вероятно, захотите сделать либо:

ls

или

ls $PWD

как у вас сейчас, он попытается перечислить запись для файла с именем "pwd".

И vim, и nano могут выполнять подсветку синтаксиса для Bash. Если они еще не настроены в ~/.nanorc и ~/.vimrc, вы можете сделать это:

для нано:

nano -Y sh scriptname

Для vim:

:syntax on
:set filetype=sh
1 голос
/ 11 декабря 2009

1) вам не нужно использовать так много эхо-сигналов .. для создания системы меню вы можете использовать cat-document, например

cat <<EOF
-------------------------------------------------------
Select one of the following options:
d or D) Display today's date and time
l or L) List the contents of the present working directory
w or W) See who is logged in
p or P) Print the present working directory
a or A) List the contents of a specified directory
b or B) Create a backup copy of an ordinary file
q or Q) Quit this program
--------------------------------------------------------
EOF

или даже это сделает

echo "-------------------------------------------------------
Select one of the following options:
d or D) Display today's date and time
l or L) List the contents of the present working directory
w or W) See who is logged in
p or P) Print the present working directory
a or A) List the contents of a specified directory
b or B) Create a backup copy of an ordinary file
q or Q) Quit this program
--------------------------------------------------------"

2) когда вы просите использовать, чтобы выбрать опцию, вы можете использовать read с -p, например,

read -p "Enter your option and hit <Enter>: " choice

3) printf более переносим, ​​чем echo, поэтому вы должны использовать его, когда это возможно.

...