如何附加命令的返回状态并遍历关联数组并打印结果。这似乎很简单,可以使用示例代码,但不能在函数中使用。 我尝试引用键和值以推送到数组,但未打印值。在追加到数组之后,我确实检查了返回状态,这是成功的。但是,它不在关联数组中。
数组未正确分配值,因此未按预期打印值。
相同的代码在我的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
答案 0 :(得分:1)
您通过命令替换(buildService()
进行的函数$()
的调用在子进程中执行,并且不会影响父进程中的BUILDSTATUS
变量或作为{{1 }}手册页中写道:
命令替换,在与外壳环境重复的子外壳环境中调用[...]对子外壳环境所做的更改不会影响外壳的执行环境。
我建议仅在bash(1)
内部输出当前Maven调用的构建状态,并在调用过程中将其添加到buildService()
中。当前,您还有其他几个BUILDSTATUS
语句。您需要将它们重定向到其他地方,否则它们将在调用过程中使您对echo
的分配混乱。