如何将其转化为循环?我在循环变量时遇到了问题。
WSTATUS="exited" //example output from command
VSTATUS="running"
NSTATUS="running"
JSTATUS="running"
if [[ $WSTATUS == run* ]]; then
WSTATUS=${GREEN}$WSTATUS
else
WSTATUS=${RED}$WSTATUS
fi
if [[ $VSTATUS == run* ]]; then
VSTATUS=${GREEN}$VSTATUS
else
VSTATUS=${RED}$VSTATUS
fi
if [[ $NSTATUS == run* ]]; then
NSTATUS=${GREEN}$NSTATUS
else
NSTATUS=${RED}$NSTATUS
fi
if [[ $JSTATUS == run* ]]; then
JSTATUS=${GREEN}$JSTATUS
else
JSTATUS=${RED}$JSTATUS
fi
我试过这个:
...varibles
array=( $WSTATUS $VSTATUS $NSTATUS $JSTATUS )
for value in "${array[@]}"
do
if [[ $value == run* ]]; then
WSTATUS=${GREEN}$value
else
WSTATUS=${RED}$value
fi
done
如何迭代bash变量,而不是它们的内容?将此wstatus更改为值无效-->WSTATUS=${GREEN}$value
不是一个循环,但一个函数已经帮了很多忙:
colorme() {
if [[ "$1" == run* ]]; then
printf '%s' "${GREEN}$1"
else
printf '%s' "${RED}$1"
fi
}
WSTATUS=$(colorme "$WSTATUS")
VSTATUS=$(colorme "$VSTATUS")
NSTATUS=$(colorme "$NSTATUS")
JSTATUS=$(colorme "$JSTATUS")
您可以使用nameref(以下脚本中的declare -n var
(
#!/usr/bin/env bash
GREEN=GREEN
RED=RED
WSTATUS="exited"
VSTATUS="running"
NSTATUS="running"
JSTATUS="running"
array=( WSTATUS VSTATUS NSTATUS JSTATUS )
declare -n var
for var in "${array[@]}"
do
[[ $var == run* ]] && prefix="${GREEN}" || prefix="${RED}"
var="$prefix$var"
done
declare -p WSTATUS VSTATUS NSTATUS JSTATUS
您想要的是声明和!扩展
a=b
declare $b=12
echo $b
=>12
这是为了设置一个变量,该变量的名称是通过计算得出的(此处来自另一个变量(
echo ${!a}
=>12
这是为了访问名称存储在另一个变量中的变量的内容
所以在你的情况下,它可能看起来像
WSTATUS="exited" //example output from command
VSTATUS="running"
NSTATUS="running"
JSTATUS="running"
totest=( WSTATUS VSTATUS NSTATUS JSTATUS )
for name in ${array[@]}
do
if [[ ${!name} == run* ]]; then
declare $name=${GREEN}${!name}
else
declare $name=${RED}${!name}
fi
done
在不进行任何其他修改的情况下复制脚本。我对在可变内容中添加这些明显是绿色和红色的转义码的想法有所保留,而不是在打印时做出这个决定。我没有真正尝试去理解,也没有测试你的剧本正在采取的行动。甚至,(XY问题括号(您需要的是循环通过变量这一事实也是值得怀疑的。knittl解决方案虽然不能回答您的问题,但可能是解决实际问题的更好方案。
但,你们的问题是如何循环通过变量。这是一种方法。