在Shell脚本中使用地图功能

时间:2018-08-24 17:31:56

标签: java bash shell

我在shellscript下面

MYMAP12=$(java -jar hello-0.0.1-SNAPSHOT.jar)
echo  "==="
echo ${MYMAP12}

java -jar hello-0.0.1-SNAPSHOT.jar的输出将为映射{one=one, two=two, three=three} 如何从shell脚本中的键中获取每个元素

我尝试了echo ${MYMAP12{one}},但它给了我一个错误

2 个答案:

答案 0 :(得分:2)

正如@chepner所暗示的那样,Java代码只是输出一个文本字符串,必须使用bash对其进行解析和操作才能使其有用。毫无疑问,有几种方法可以做到这一点,这是一种使用纯bash(即没有外部程序)的方法:

# This is the text string supplied by Java
MYMAP12='{one=one, two=two, three=three}'

# Create an associative array called 'map'
declare -A map

# Remove first and last characters ( { and } )
MYMAP12=${MYMAP12#?}
MYMAP12=${MYMAP12%?}
# Remove ,
MYMAP12=${MYMAP12//,/}

# The list is now delimited by spaces, the default in a shell
for item in $MYMAP12
do
    # This splits around '='
    IFS='=' read key val <<< $item
    map[$key]=$val
done

echo "keys: ${!map[@]}"
echo "values: ${map[@]}"

礼物:

keys: two three one
values: two three one

编辑:

您应该为作业使用正确的工具,如果需要关联数组(映射,哈希表,字典),则需要具有该功能的语言。其中包括bashkshawkperlrubypythonC++

您可以使用POSIX外壳程序(sh)提取键和值,但是由于sh不具有此功能,因此不能将它们存储在关联数组中。最好的办法是使用通用的 list ,它只是由空格分隔的值的文本字符串。您可以做的是编写一个模拟它的查找功能:

get_value() {
    map="$1"
    key="$2"

    for pair in $MYMAP12
    do  
        if [ "$key" = "${pair%=*}" ]
        then
            value="${pair#*=}"
            # Remove last character ( , or } )
            value=${value%?}
            echo "$value"
            return 0
        fi
    done

    return 1
}

MYMAP12='{kone=one, ktwo=two, kthree=three}'

# Remove first character ( { )
MYMAP12=${MYMAP12#?}

val=$(get_value "$MYMAP12" "ktwo")
echo "value for 'ktwo' is $val"

礼物:

value for 'ktwo' is two

使用此功能,您还可以测试键的存在,例如:

if get_value "$MYMAP12" "kfour"
then
    echo "key kfour exists"
else
    echo "key kfour does not exist"
fi

礼物:

key kfour does not exist

请注意,与关联数组相比,这是低效率的,因为我们按顺序搜索列表,尽管只有三个键的简短列表,您不会发现任何区别。

答案 1 :(得分:1)

如果您将输出格式更改为右侧

$ x="( [one]=foo [two]=bar [three]=baz )"

然后,您可以使用bash关联数组

$ declare -A map="$x"
$ echo "${map[one]}"
foo