我在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}}
,但它给了我一个错误
答案 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
编辑:
您应该为作业使用正确的工具,如果需要关联数组(映射,哈希表,字典),则需要具有该功能的语言。其中包括bash
,ksh
,awk
,perl
,ruby
,python
和C++
。
您可以使用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