Лучший способ найти значение переменной Bash в другом файле без "источника"? - PullRequest
0 голосов
/ 21 февраля 2020

Без использования source для загрузки другого файла конфигурации / скрипта Bash, какой самый простой способ найти значение переменной Bash, определенной в другом (временном) файле?

Я видел похожие фрагменты с использованием cat + while, grep и даже eval, но ни один из них не выглядит очень чистым и не может быть применен к этому сценарию, кажется ...

Например:

update.sh хочет загрузить и проверить значение переменной LATEST в файле /tmp/config, прежде чем решить, следует ли продолжить процесс обновления.

Обновлено (добавлено больше контекста ):

#!/bin/bash

## current config (includes an existing CONFIG_BUILD variable) ##
source config

## compability for updating config ##
UPDATER_BUILD="FEB2020"

## retrieve latest version of config online ##
wget -O /tmp/config http://mirrors.example.com/config-boilerplate

## ensure retrieved config boilerplate is compatible with current updater ##
CONFIG_LATEST=$(source /tmp/config; echo $CONFIG_BUILD)

if [[ "$CONFIG_LATEST" != "$UPDATER_BUILD" ]]; then
    echo -e "Sorry, this updater is outdated or incompatible."
    exit 1
fi

Обновлено (снова): FML, мне не хватало точки с запятой в подоболочке. Таким образом, источник subshell на самом деле работает нормально без каких-либо конфликтов, несмотря на то, что имя VAR уже получено ... все это говорит о том, что если кто-то еще сможет комментировать решения, не являющиеся источниками, было бы здорово. Я искал несколько дней и не много обсуждений по этой теме c, хотя, наконец, нашел одно:

Могу ли я экспортировать переменную в среду из сценария bash без его поиска?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вам не нужно его искать. Вы можете использовать cat или все, что хотите прочитать в вашей оболочке, например,

#!/bin/bash
echo "myval is empty: $myval "
echo "my_Temp_var" > /tmp/tempvar

myval=$(cat /tmp/tempvar)

echo "myval is no longer empty: $myval "

output:

myval is empty:
myval is no longer empty: my_Temp_var

edit:

Для вашей 'var cla sh '

просто сделайте это так:

my_var=this_var
my_var_source=$(source /tmp/tempvar; echo $my_var)

echo "my_var is: $my_var"
echo "my_var_source is: $my_var_source"

. /tmp/tempvar

echo "If I don't sub from a subshell then it overrides: $my_var"

output

my_var is: this_var
my_var_source is: Temp_var
If I don't sub from a subshell then it overrides: Temp_var
2 голосов
/ 21 февраля 2020

Используя source в подоболочке)

Первый скрипт

$ cat test
#!/bin/bash

test=123

(. ./test2; echo $test)
echo $test

Второй скрипт

$ cat test2
#!/bin/bash
test=456

Тестирование

$ ./test 
456
123

Или grep к var и удалите все до последнего = в случае умножения результатов grep.

test2=$(grep -o 'test=[0-9a-z]*' test2)
echo "${test2##*=}"

Измените script1 на этот

$ cat test
#!/bin/bash

test=123

(. ./test2; echo $test)
echo $test

test2=$(grep -o 'test=[0-9a-z]*' test2)
echo "${test2##*=}"

И script2 на этот

$ cat test2
#!/bin/bash
test=456; test2=asef
test=5    test3=234
test=

Выполните тест

$ ./test 

123

Но есть и слишком множество способов настроить vars для использования этого метода

$ cat test2
#!/bin/bash
test=456; test2=asef
test=5    test3=234
test=
test+=5; ((test--))

$ ./test
4
123
5

Обновление после обновления вопроса) Если вы хотите сохранить свои vars, установите их как readonly после поиска:

$ cat test
#!/bin/bash

. test2
declare -r test1 test2
echo $test1 $test2
. test3
echo $test1 $test2

$ cat test2
test1=123
test2=456

$ cat test3
test1=sdf
test2=yuo

$ ./test
123 456
test2: line 1: test1: readonly variable
test2: line 2: test2: readonly variable
123 456

Shell выиграла ' t позволяет получать только для чтения vars

...