Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Bash在循环中设置全局变量并保留其值——或者为假人处理替换_Bash_Scripting_Posix_Process Substitution - Fatal编程技术网

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

我是一名C/C++程序员,总体来说相当愚蠢(或者至少bash做事情的方式让我感到困惑)。我无法控制自己

我需要定义一个全局布尔值,将其设置在循环中的某个位置,并在全局范围内使用它。有人能用最简单的方式解释一下如何修改下面的代码,让我实现我的用例,足够简单,这样我明天就不必再绞尽脑汁去尝试和掌握流程替换了

# 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何时作为子进程运行命令。有两种情况与该问题有关:

  • 由管道连接的每个进程都是当前shell的子进程

  • 运行带有重定向的单个内置命令(例如,
    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