Java 在shell脚本中使用映射功能
我有下面的脚本Java 在shell脚本中使用映射功能,java,bash,shell,Java,Bash,Shell,我有下面的脚本 MYMAP12=$(java -jar hello-0.0.1-SNAPSHOT.jar) echo "===" echo ${MYMAP12} java-jarhello-0.0.1-SNAPSHOT.jar的输出将是map{one=one,two=two,three=three} 如何从shell脚本中的键获取每个元素 我尝试了echo${MYMAP12{one}},但是如果您将输出格式更改为右侧,它会给我一个错误 $ x="( [one]=foo [two]=bar [
MYMAP12=$(java -jar hello-0.0.1-SNAPSHOT.jar)
echo "==="
echo ${MYMAP12}
java-jarhello-0.0.1-SNAPSHOT.jar的输出将是map{one=one,two=two,three=three}
如何从shell脚本中的键获取每个元素
我尝试了
echo${MYMAP12{one}}
,但是如果您将输出格式更改为右侧,它会给我一个错误
$ x="( [one]=foo [two]=bar [three]=baz )"
然后,可以使用bash
关联数组
$ declare -A map="$x"
$ echo "${map[one]}"
foo
如果将输出格式更改为右侧
$ x="( [one]=foo [two]=bar [three]=baz )"
然后,可以使用bash
关联数组
$ declare -A map="$x"
$ echo "${map[one]}"
foo
正如@chepner所暗示的,Java代码只是输出一个文本字符串,必须在bash中对其进行解析和操作才能使其有用。毫无疑问,有几种方法可以做到这一点,这里有一种使用纯bash(即没有外部程序)的方法: 编辑: 您应该为作业使用正确的工具,如果您需要关联数组(映射、哈希表、字典),那么您需要具有该功能的语言。其中包括
bash
,ksh
,awk
,perl
,ruby
,python
和C++
可以使用POSIX外壳(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"
给出:
keys: two three one
values: two three one
value for 'ktwo' is two
key kfour does not exist
使用此功能,您还可以测试是否存在钥匙,例如:
if get_value "$MYMAP12" "kfour"
then
echo "key kfour exists"
else
echo "key kfour does not exist"
fi
给出:
keys: two three one
values: two three one
value for 'ktwo' is two
key kfour does not exist
请注意,与关联数组相比,这是低效的,因为我们正在按顺序搜索一个列表,尽管对于只有三个键的短列表,您不会看到任何差异。正如@chepner所暗示的,Java代码只是输出一个文本字符串,必须在bash中对其进行解析和操作,以使其有用。毫无疑问,有几种方法可以做到这一点,这里有一种使用纯bash(即没有外部程序)的方法: 编辑: 您应该为作业使用正确的工具,如果您需要关联数组(映射、哈希表、字典),那么您需要具有该功能的语言。其中包括
bash
,ksh
,awk
,perl
,ruby
,python
和C++
可以使用POSIX外壳(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"
给出:
keys: two three one
values: two three one
value for 'ktwo' is two
key kfour does not exist
使用此功能,您还可以测试是否存在钥匙,例如:
if get_value "$MYMAP12" "kfour"
then
echo "key kfour exists"
else
echo "key kfour does not exist"
fi
给出:
keys: two three one
values: two three one
value for 'ktwo' is two
key kfour does not exist
请注意,与关联数组相比,这是低效的,因为我们正在按顺序搜索一个列表,虽然只有三个键的短列表,您不会看到任何差异。充其量,Java程序输出的是针对不同使用者的内容。在最坏的情况下,它只是输出无意义的伪代码。更改
hello-0.0.1-SNAPSHOT
以输出bash
可以使用的内容,或者从可以解析输出的环境中使用Java程序。Java程序最多只能输出用于其他使用者的内容。在最坏的情况下,它只是输出无意义的伪代码。要么更改hello-0.0.1-SNAPSHOT
以输出bash
可以使用的内容,要么从可以解析输出的环境中使用Java程序。我想在Shell中执行此操作,我在declare处收到一个错误-关于在Shell脚本中使用此脚本的映射。上面的代码可能在bash中。请给出错误消息。我使用bash是因为你的问题上有bash标签。注意,我的回答是“纯bash”。请定义您所说的“外壳”是什么意思,它是一个通用术语。如果您的意思是要使用sh
(POSIX shell),那么您就不走运了,因为sh
不支持关联数组。我想在shell中执行此操作,但在使用此shell脚本时,我在declare-A映射中遇到了一个错误。上面的代码可能在bash中。请给出错误消息。我使用bash是因为你的问题上有bash标签。注意,我的回答是“纯bash”。请定义您所说的“外壳”是什么意思,它是一个通用术语。如果您的意思是要使用sh
(POSIX shell),那么您就不走运了,因为sh
不支持关联数组。