экранирование специальных символов в bash, case-функция - PullRequest
2 голосов
/ 20 июня 2011

Я создаю скрипт на bash.Этот скрипт будет делать то же самое, что и база данных MySQL, я уже собрал функции SELECT, INSERT, UPDATE, DELETE, и я уже создал для него меню входа.Теперь последнее, что мне нужно сделать, - это иметь возможность вставлять операторы SQL в командную строку после запуска сценария. Я уже создал функцию, позволяющую вводить «--help» в командной строке для запуска справки.функция.Я также уже создал опцию для ввода команды SELECT в командной строке, например:

./database.sh SELECT name FROM student

Это покажет полный список имен, доступных в базе данных.Но я не могу заставить работать приведенный ниже оператор:

Например:

./database.sh SELECT * FROM student

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

if [ -z $1 ]; then
    Inlog
else
    if [ "$1" = "--help" ] ; then
        Help
    else

        case "$*" in
            "SELECT naam FROM student")
                echo "Hieronder is een overzicht van de namen van de studenten die aanwezig zijn in de database."
                echo "------------------------"
                cat $naam_dir
                ;;
            "SELECT nummer FROM student")
                echo "Hieronder is een overzicht van de studentnummers van de studenten die in de database aanwezig zijn."
                echo "------------------------"
                cat $nummer_dir
                ;;
            "SELECT mail FROM student")
                echo "Hieronder is een overzicht van de e-mail adressen van de studenten die in de database aanwezig zijn."
                echo "-----------------------"
                cat $mail_dir
                ;;
            "SELECT \*\ FROM student")
                paste $naam_dir $nummer_dir $mail_dir | expand t-20
            *)
                exit
                ;;
        esac
    fi
fi

Я надеялся, что кто-нибудь может помочь мне избежать этих символов.SQL-запрос также должен заканчиваться символом «;», так как я также не смог выполнить это в bash ... Возможно, у кого-то есть идея.

Ответы [ 3 ]

1 голос
/ 20 июня 2011

посмотрите на переключатель -q на printf

Пример

$ printf "%q" "'include_path=/path/to/dir'" 
\'include_path=/path/to/dir\'

От help printf:

В дополнение к стандартному форматуспецификации, описанные в printf (1) и printf (3), printf интерпретирует:

  %b    expand backslash escape sequences in the corresponding argument
  %q    quote the argument in a way that can be reused as shell input
0 голосов
/ 20 июня 2011

Возможно, вы захотите определить свои собственные условия.Вместо использования * в командной строке вы можете использовать ALL.Или что-нибудь еще, что вам нравится.Может быть даже лучше для пользователя.

0 голосов
/ 20 июня 2011

Боюсь, что вы не получите это на работу.Причина в том, что *, а также ; имеют специальные значения для оболочки.То есть * - это подстановочный знак, соответствующий всем файлам в текущем каталоге.Вы должны были бы экранировать / указать это уже при вызове команды , например:

./database.sh "SELECT * FROM student"

или

./database.sh SELECT \* FROM student

Вам не нужно экранировать * в выражении case, поскольку оно уже заключено в кавычки ".

Знак ; имеет специальное значение (см. man bash) ... commands separated by a ; are executed sequentially).Это означает, что вы всегда можете добавить ; к вызову команды, но он не будет передан вызываемой команде в качестве аргумента, за исключением случаев, когда вы ее экранируете / цитируете:: Я только что видел промежуточное редактирование Фредрика.
Можно использовать set -f, чтобы отключить расширение имени файла в bash (то есть * не будет расширяться).Но это должно быть выполнено в вызывающей оболочке и не может быть выполнено в сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...