Странное поведение строковых переменных в скрипте bash ... Пожалуйста, помогите! - PullRequest
1 голос
/ 03 августа 2010

Я схожу с ума с этим ... позвольте мне объяснить ...

У меня есть очень простой скрипт Bash с функцией, которая получает 3 аргумента.Все эти аргументы являются строками.Все работало нормально, пока мне не пришлось передать строку с пробелами в функцию.

У меня также есть некоторый тестовый код для вызова функции (имя которого substracFromFile):

# try the function

PATTERN=`echo -e '<Location test14>'`

echo "PATTERN IS $PATTERN"

HEADERPATTERN=`echo -e '<Location [a-zA-Z0-9]*>'`

echo "HEADERPATTERN IS $HEADERPATTERN"

FILE="subversion.conf"

echo "FILE IS $FICHERO"

substracFromFile $PATTERN $HEADERPATTERN $FILE

Вывод этого:

PATTERN IS <Location prueba14>
HEADERPATTERN IS <Location [a-zA-Z0-9]*>
FILE IS subversion.conf
PATTERN ARGUMENT IS <Location
HEADERPATTERN ARGUMENT IS prueba14>
FILE ARGUMENT IS <Location
grep: <Location: No such file or directory
expr: syntax error

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

function substracFromFile
{

        PATTERN=$1

        HEADERPATTERN=$2

        FILE=$3

        # Debug only
        echo "HEADER ARGUMENT IS $PATTERN"

        # Debug only
        echo "HEADERPATTERN ARGUMENT IS $HEADERPATTERN"

        # Debug only
        echo "FILE ARGUMENT IS $FILE"

Это работало очень долгокак переданные строки не имели пробелов вообще.Когда я вызываю функцию, строки кажутся нормальными, но я не понимаю, почему они разделяются после вызова функции .... Я уверен, что это довольно скучно, но я просто не понимаю ....

Заранее спасибо, Алекс

1 Ответ

1 голос
/ 03 августа 2010

Части вашего вопроса несовместимы с другими частями.Например:

FILE="subversion.conf"

echo "FILE IS $FICHERO"

Но я предполагаю, что это просто ошибки, допущенные при публикации вопроса.

Поскольку ghostdog74 упоминается в комментарии, вам нужно процитироватьпеременные, которые содержат пробелы.В частности, эта строка должна иметь кавычки вокруг переменных:

substracFromFile "$PATTERN" "$HEADERPATTERN" "$FILE"

Кроме того, я не понимаю, почему вы используете echo для установки переменных в таких строках, как эта:

PATTERN=`echo -e '<Location test14>'`

Это может быть просто:

PATTERN='<Location test14>'

Если значение иногда выходит за пределы специальных символов, вы можете использовать один из следующих методов:

PATTERN=$'value\nwith\tescapes'

, который будет иметь"value" newline "с" tab "избегает" в качестве значения.

Кроме того, я рекомендую привыкнуть не использовать все заглавные буквы для имен переменных.Это уменьшит вероятность конфликтов имен со встроенными переменными Bash.

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