Bash在循环中设置全局变量并保留其值——或者为假人处理替换
我是一名C/C++程序员,总体来说相当愚蠢(或者至少bash做事情的方式让我感到困惑)。我无法控制自己 我需要定义一个全局布尔值,将其设置在循环中的某个位置,并在全局范围内使用它。有人能用最简单的方式解释一下如何修改下面的代码,让我实现我的用例,足够简单,这样我明天就不必再绞尽脑汁去尝试和掌握流程替换了Bash在循环中设置全局变量并保留其值——或者为假人处理替换,bash,scripting,posix,process-substitution,Bash,Scripting,Posix,Process Substitution,我是一名C/C++程序员,总体来说相当愚蠢(或者至少bash做事情的方式让我感到困惑)。我无法控制自己 我需要定义一个全局布尔值,将其设置在循环中的某个位置,并在全局范围内使用它。有人能用最简单的方式解释一下如何修改下面的代码,让我实现我的用例,足够简单,这样我明天就不必再绞尽脑汁去尝试和掌握流程替换了 # DEFINE HERE for i in `seq 0 ${DAEMON_COUNT}`; do if [ ! -d "data$i" ]; then # SET HERE
# DEFINE HERE
for i in `seq 0 ${DAEMON_COUNT}`;
do
if [ ! -d "data$i" ]; then
# SET HERE
echo "data$i does not exist. Creating...";
mkdir data$i
fi
done
# TEST AND USE HERE
老实说,我认为bash无法胜任这项任务。。。。下一个街区看起来像这样
echo "-------------------------------------------------------------------------------"
echo "checking the state of potentially running daemons"
for i in `seq 0 ${DAEMON_COUNT}`;
do
if [ ! -e "data$i/mongod.lock" ] ; then
echo "[no lock file] mongod process $i does not exist"
else
echo "[lock file exists] process $i lock file exists "
I_PID=`cat data$i/mongod.lock`
if [ ! ${I_PID} ]; then
echo " [GOOD] lock pid empty"
elif [ "`ps -p ${I_PID} | grep ${I_PID}`" ]; then
echo " [GOOD] data1 pid: ${I_PID} running"
else
echo "[PROBABLY FATAL] data1 pid: ${I_PID} not running."
fi
fi
done
echo "-------------------------------------------------------------------------------"
我现在需要的是一个结构的全局数组,这样我就可以对它们进行循环,并采取有条件的操作来正确初始化我的守护进程:/
,我退缩的唯一原因是必须安装Rock,我不喜欢特殊代码库在我的机器上吐出他们想要的任何东西:D我可能理解错误,但是
bool=false;
for i in `seq 0 ${DAEMON_COUNT}`;
do
if [ ! -d "data$i" ]; then
bool=true;
echo "data$i does not exist. Creating...";
mkdir data$i
fi
done
if [ $bool = true ]; then
...
fi
这就是您想要的吗?需要理解的重要一点是:子进程天生就有自己的环境,不能影响其父进程的变量。如果在子进程中设置变量,则父进程中变量的值不受影响。这实际上是两个不同的变量,恰好同名 要理解的第二件事是bash何时作为子进程运行命令。有两种情况与该问题有关:
for
构造的是否会隐式生成子进程?这就是我在尝试时遇到的行为。不。因此,您的代码实际上是正常的。避免管道,尽管:-)它会在我的计算机上打印一个零:(你的操作系统和shell是什么?哪个版本?@hassansy只要你不在变量前面加上local
关键字,按原样编写的代码就应该像Adam所说的那样工作。大多数情况下,当人们在读行时执行some_命令;dosomevar=foo;done;echo$someVar
时就会出现这个问题,因为while循环是在管道之后,父shell将不知道有关someVar
的任何信息。您可以通过使用进程替换而不是建议的管道来避免这种情况。是的,这将是我的第一个愿望。我的第二个愿望是跟踪布尔的MxN数组。
$ somevar=initial
$ echo test1 | read somevar
$ echo $somevar
initial
$ read somevar < <(echo test2)
$ echo $somevar
test2
# DEFINE HERE
SOMEVAR=0
DAEMON_COUNT=10
for i in `seq 0 ${DAEMON_COUNT}`;
do
if [ ! -d "data$i" ]; then
# SET HERE
SOMEVAR=10
echo "data$i does not exist. Creating...";
mkdir data$i
fi
done
# TEST AND USE HERE
echo ${SOMEVAR} # This displays 10