Разобрать $ {} заполнитель в абсолютный путь в сценарии оболочки - PullRequest
0 голосов
/ 01 июля 2018

У меня есть файл app.properties что-то вроде ниже

Base.dir="/user/test/application"
Result.dir="${base.dir}/result"

и я создал скрипт bash для разбора вышеуказанных свойств

function readConfigFile()
{
  (grep -E "^${2}=" -m 1 "${1}" 2>/dev/null || echo "VAR=__UNDEFINED__") | head -n 1 | cut -d '=' -f 2-;
}

function setConfigFile()
{
    sourceFile=${1}
}

function configGet()
{
    if [ ! -z $sourceFile ]; then
        val="$(readConfigFile $sourceFile "${1}")";
        if [ "${val}" = "__UNDEFINED__" ]; then
            echo "${1} value not exist"
            # return empty string
            printf -- "%s" "";
        fi
        printf -- "%s" "${val}";
    else
        echo "config file not exist"
        # return empty string
        printf -- "%s" "";
    fi
}

и способ, которым я вызываю выше парсер, похож на ниже

$Result_dir=$(configGet Result.dir)

однако, я не могу перевести местозаполнитель $ {} в base_dir

и я получил следующую ошибку

ls $Result_dir
ls: cannot access ${Base_dir}/result: No such file or directory

Можно ли как-нибудь перевести $ {Base.dir} в / user / test / application?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Почему у вас . в имени переменной, что не разрешено в bash:

$ Base.dir="/user/test/application"
-bash: Base.dir=/user/test/application: No such file or directory
$ Base_dir="/user/test/application"
$

Итак, почему вы получаете No such file or directory? Вот объяснение:

Создайте файл с именем Base.dir=gash.sh, да, это допустимое имя файла

$ echo 'echo Hello World' > Base.dir=gash.sh

Сделать файл исполняемым:

$ PATH=$PATH:.
$ chmod u+x Base.dir=gash.sh

Теперь введите команду:

$ Base.dir="gash.sh"
Hello World

Используйте подчеркивание, а не точку. Кстати, оболочка ksh Korn не только допускает точку, она имеет особое значение, это составная переменная .

0 голосов
/ 01 июля 2018

Я думаю, вы не сможете заменить ${base.dir} (кстати, не должно ли это быть ${Base.dir}?) Так, как вы надеялись, главным образом потому, что, насколько я знаю, точки не допускаются в переменной имена в bash.

Что вы можете сделать, это вручную заменить часть ${base.dir} на соответствующий путь, используя синтаксис подстановки bash. Например:

setConfigFile 'app.properties'

Result_dir_raw=$(configGet Result.dir)
Result_dir=${Result_dir_raw/'${base.dir}'/$(configGet Base.dir)}

echo ${Result_dir}

Я говорю «вручную», потому что вы все еще указываете в своем исходном коде, что шаблон, который вы хотите заменить, - ${base.dir}, который, как я предполагаю, не тот, который вы хотели.

Теперь, если вы запустите это, вы увидите, что переменная ${Result_dir} оценивается как ""/user/test/application"/result", что, очевидно, не путь, и это потому, что вы окружаете пути в app.properties двойными кавычками, поэтому вам нужно либо избавиться от них в функции readConfigFile, либо полностью потерять их в файле конфигурации, что для меня более логично.

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