gpt4 book ai didi

java - 在 shell 脚本中使用 map 功能

转载 作者:行者123 更新时间:2023-12-01 19:49:17 24 4
gpt4 key购买 nike

我有以下 shellscript

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

java -jar hello-0.0.1-SNAPSHOT.jar 的输出将是 map {one=one, Two=two, Three= Three}如何从shell脚本中的键中获取每个元素

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

最佳答案

正如 @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

编辑:

您应该使用正确的工具来完成这项工作,如果您需要关联数组(映射、哈希表、字典),那么您需要一种具有该功能的语言。其中包括 bashkshawkperlruby pythonC++

您可以使用 POSIX shell (sh) 提取键和值,但无法将它们存储在关联数组中,因为 sh 没有该功能。您能做的最好的事情就是一个通用的列表,它只是一个由空格分隔的值的文本字符串。您可以做的是编写一个模拟它的查找函数:

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

使用此函数,您还可以测试 key 是否存在,例如:

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

给予:

key kfour does not exist

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

关于java - 在 shell 脚本中使用 map 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com