2013-12-05 3 views
1

У меня есть тестовый сценарий:Почитаю назначение переменной Bash из другого файла

#!/bin/bash 
echo "Read a variable" 
#open file 
exec 6<test.txt 
read EXAMPLE <&6 
#close file again 
exec 6<&- 
echo $EXAMPLE 

Файл test.txt имеет только одну строку:

EXAMPLE=1 

Выход:

bash-3.2$ ./Read_Variables.sh 
Read the variable 
EXAMPLE=1 

Мне нужно просто использовать значение $EXAMPLE, в данном случае 1. Итак, как я могу избежать получения части EXAMPLE= на выходе?

Благодаря

ответ

6

Если файл, содержащий переменные используют синтаксис Баша во всем (например, X = Y), другой вариант заключается в использовании source:

#!/bin/bash 
echo "Read a variable" 
source test.txt 
echo $EXAMPLE 
+1

+1 Собирался добавить это сам. Я сделал это в любом случае. –

+0

Думайте, что это самый простой способ сделать это. Хотя @HermanTorjussen ваш метод работал, и я не знаю, что вы могли бы читать строку как массив, это определенно будет полезно позже. БЛАГОДАРЯ! –

0

Вы можете прочитать строку в виде массива (обратите внимание на опцию -a), которые затем могут быть проиндексированы в:

# ... 
IFS='=' read -a EXAMPLE <&6 
echo ${EXAMPLE[0]} # EXAMPLE 
echo ${EXAMPLE[1]} # 1 
# ... 

Этот вызов read разделяет входную линию на IFS и помещает оставшиеся части в индексированный массив. См. help read для получения дополнительной информации о read вариантах и ​​поведении. Вы также могли бы манипулировать EXAMPLE переменную непосредственно:

# ... 
read EXAMPLE <&6 
echo ${EXAMPLE##*=} # 1 
# ... 

Если все, что вам нужно, это «импорт» и другие заявления Bash из файла вы должны просто использовать:

source file 
4

Я думаю, что большинство пр Это можно сделать путем поиска файла, который содержит переменную (если он имеет синтаксис bash), но если бы я это сделал, я бы поставил его в подоболочку, так что если бы там были какие-либо другие переменные, они не отменяют любое важные переменные в текущей оболочке:

(. test.txt && echo $EXAMPLE) 
+0

Простой и элегантный! – Junaid

5

в качестве альтернативы снабжает весь файл, вы можете попробовать следующее:

while read line; do 
    [[ $line =~ EXAMPLE= ]] && declare "$line" && break 
done < test.txt 

, который будет сканировать файл, пока он не найдет первая строка, которая выглядит как присвоение EXAMPLE, затем используйте встроенную команду declare для выполнения задания. Это, вероятно, немного медленнее, но это более избирательно относительно того, что на самом деле выполняется.

Смежные вопросы