Bash设置变量函数

时间:2016-02-19 18:48:37

标签: bash

我有一个获取应用名称和版本

的功能
function get_versions() {
ver_file="versions.txt";
for service in $(cat $ver_file | cut -f1 -d:) ; do
 for ver in $(grep $service $ver_file | cut -f2 -d:) ; do 
  local $service_ ver=$ver;
 done;
done;
}

我想设置像apache-ver = 2.0这样的环境变量。 (通过echo将是echo $ apache-ver) versions.txt看起来像这样: 阿帕奇:2.0

我尝试了很多方法来设置它 但我没有找到解决方案 感谢

2 个答案:

答案 0 :(得分:2)

这是我的版本。我使用catcut来取消IFSread。请注意,封装在函数中的任何变量都标记为local

bash中不能包含包含连字符的变量名,因此apache-ver=2.0无效。我改用了下划线。

变量是使用eval动态创建的,这是少数几个有用的场合之一,但是为什么要动态创建变量名称是个谜。如果需要,您可以轻松地将export添加到该行,但由于动态变量未标记为本地,因此在整个脚本中都可以看到它。

# Use fuction, or (), not both
get_versions() {
    local ver_file="versions.txt"
    local service ver

    while IFS=':' read service ver
    do
        local name="${service}_ver"

        # Sanitize edit
        name=${name/[\-.]/'_'}
        eval "$name='$ver'"
    done < "$ver_file"
}  

get_versions
echo $apache_ver
echo $tester_ver

我的versions.txt看起来像这样:

apache:2.0
tester:3.3

脚本输出:

2.0
3.3

答案 1 :(得分:0)

您可以使用导出来存档此

/ # cat versions.txt
aaaa:01
bbbb:02

/ # cat test.sh
#/bin/bash

ver_file=versions.txt
for service in $(cat $ver_file | cut -f1 -d:) ; do
 for ver in $(grep $service $ver_file | cut -f2 -d:) ; do 
  echo export $service=$ver
 done;
done;

/ # eval $(./test.sh)
/ # echo $aaaa
01
/ # echo $bbbb
02
/ #