从其他文件中读取Bash变量赋值

时间:2013-12-05 17:02:02

标签: bash shell unix scripting

我有这个测试脚本:

#!/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=部分呢?

由于

4 个答案:

答案 0 :(得分:6)

如果包含变量的文件始终使用bash语法(例如X = Y),则另一个选项是使用source

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

答案 1 :(得分:5)

作为采购整个文件的替代方法,您可以尝试以下方法:

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

将扫描文件,直到找到第一行看起来像EXAMPLE的赋值,然后使用declare内置来执行赋值。它可能有点慢,但它对实际执行的内容更具选择性。

答案 2 :(得分:4)

我认为最合适的方法是通过获取包含变量的文件(如果它有bash语法),但如果我这样做,我会在子shell中获取它,这样如果有的话在那里声明的其他变量,它们不会覆盖当前shell中的任何重要变量:

(. test.txt && echo $EXAMPLE)

答案 3 :(得分: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