Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在shell脚本中使用映射功能_Java_Bash_Shell - Fatal编程技术网

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
不支持关联数组。