Bash - Как я могу выполнить переменную - PullRequest
1 голос
/ 21 апреля 2019

Я читаю файл со строками вроде:

folder=abc
name=xyz

Для некоторых строк я бы хотел установить переменную, например, name=xyz, соответствующую строке, которую я прочитал.

Вырубая, с name=xyz и folder=abc, я попробовал:

while read -r line; do
    $line
    echo $name
done < /etc/testfile.conf

Это выдает сообщение об ошибке ./test: line 4: folder=abc: command not found и т. Д.

Я пробовал "$line" и $($line), и это то же самое. Можно ли делать то, что я хочу?

Мне удалось:

while read -r line; do
    if [[ "$line" == 'folder'* ]]; then
        folder="$(echo "$line" | cut -d'=' -f 2)"
    fi
    if [[ "$line" == 'name'* ]]; then
        name="$(echo "$line" | cut -d'=' -f 2)"
    fi
done < /etc/testfile.conf

но это кажется грязным

Ответы [ 4 ]

3 голосов
/ 21 апреля 2019

для вашего образца, declare - самый безопасный вариант:

while read -r line; do
  declare "$line"
done
$ echo "$folder"
abc
$ echo "$name"
xyz
1 голос
/ 21 апреля 2019

Прямой подход, используйте eval.

Другой подход, попробуйте с source или .:

$ echo "$line"
folder=abc
$ . <(echo "$line")
$ echo "$folder"
abc

Но, вероятно, хорошим решением будет решение проблемыпо-другому.

0 голосов
/ 21 апреля 2019

почему не только исходный файл?

$ . infile ; echo "$name"
xyz
0 голосов
/ 21 апреля 2019

Вы можете немного очистить свой подход, не прибегая к eval.

while IFS="=" read -r name value; do
    case $name in
        folder) folder=$value ;;
        name) name=$value ;;
    esac
done < /etc/testfile.conf
...