将返回状态附加到bash中的关联数组

时间:2019-05-05 21:02:01

标签: arrays bash shell

如何附加命令的返回状态并遍历关联数组并打印结果。这似乎很简单,可以使用示例代码,但不能在函数中使用。 我尝试引用键和值以推送到数组,但未打印值。在追加到数组之后,我确实检查了返回状态,这是成功的。但是,它不在关联数组中。

数组未正确分配值,因此未按预期打印值。

相同的代码在我的bash版本中也起作用。

#!/bin/bash
declare -A combo
combo+=(['foo']='bar')
combo+=(['hello']='world')
for window in "${!combo[@]}"
do
    echo "The key: ${window}" # foo
    echo "The value: ${combo[${window}]}" # bar
done

如何在maven构建成功时捕获返回状态0,而在失败时如何捕获返回状态1,并分配给关联数组并在所有存储库运行后打印关联数组的结果。

#!/bin/bash

declare -A GITARRAY=(
        [git_token]=user-devops:ggc4ktalwfbf5jiqdsdhmmgj2jvvhj3ltfzdujxzxnmhj45qk525kq
        [git_branch]='development'
)
declare -A GITREPOS=(
        [repository1]=org.gitrepo.com/LIBS/_git/repository1
        [repository2]=org.gitrepo.com/LIBS/_git/repository2
)

declare -A BUILDSTATUS

target_dir=$HOME/womsrc
BASEDIR=`dirname "$(readlink -f "$0")"`
HELLOTO=`whoami`
maven_goal=compile

#repositories modifed to dummy values
REPOS=(reposiroty1 repository2)

main() {

echo "In main fuction: maven goal: $maven_goal"

if [ -n "$maven_goal" ] ; then

for REPO in "${REPOS[@]}"
do
 if [ -d "$target_dir/$REPO/.git" ] ; then
      echo "[INFO] invoking compilation for service in $REPO ..."
      service_dir="$target_dir/$REPO/$REPO"
      build_status=$(buildService $REPO $maven_goal $service_dir)
      echo "[STATUS] mvn:$maven_goal $REPO: $build_status"
 fi
done
fi  ## mavengoal end here


echo "printing build status"
for bt in "${!BUILDSTATUS[@]}"
do
    echo "key: ${bt} result: ${BUILDSTATUS[${bt}]}"  
done

} 

buildService() {
 servicename="$1"
 mavengoal="$2"
 servicedir="$3"
 cd "${servicedir}" || echo "[ERROR] cd to $servicename failed with $?"
 echo "[INFO] starting compilation in `pwd` ..."
 LOG_FILE="$COMPILE_LOGPATH/project-$servicename.log"
 mvn $mavengoal -l $LOG_FILE
 if [ "$?" -eq 0 ] ; then
   buildstatus=success
 else
   buildstatus=failure
 fi
  BUILDSTATUS+=([${servicename}]=${buildstatus})
  echo "Adding BUILDSTATUS return value: $?"
  echo "${BUILDSTATUS[${servicename}]}"
}


main

1 个答案:

答案 0 :(得分:1)

您通过命令替换(buildService()进行的函数$()的调用在子进程中执行,并且不会影响父进程中的BUILDSTATUS变量或作为{{1 }}手册页中写道:

  

命令替换,在与外壳环境重复的子外壳环境中调用[...]对子外壳环境所做的更改不会影响外壳的执行环境。

我建议仅在bash(1)内部输出当前Maven调用的构建状态,并在调用过程中将其添加到buildService()中。当前,您还有其他几个BUILDSTATUS语句。您需要将它们重定向到其他地方,否则它们将在调用过程中使您对echo的分配混乱。