我有这个测试脚本:
#!/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=
部分呢?
由于
答案 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