首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个赋值为零的变量的值为2

为什么这个赋值为零的变量的值为2
EN

Unix & Linux用户
提问于 2020-05-20 23:47:33
回答 1查看 175关注 0票数 2

当名为“enigma2”的进程不存在时,我正在尝试创建一个脚本,该脚本使用零填充变量。

当我运行这个脚本..。

代码语言:javascript
复制
#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

我得到输出..。

代码语言:javascript
复制
0  
0  

这正是我所期望的。

但当我运行这个脚本时:

代码语言:javascript
复制
#!/bin/sh

# Check if the no_enigma file exists
if [ -f /home/root/no_enigma ]; then
    # If enigma2 is running then kill it
    ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
    echo $ENIGMA_PID
    echo "$ENIGMA_PID"

    re='^[0-9]+([.][0-9]+)?我得到这个输出..。2  
2  
It IS a number  
2  
2  
enigma2 is running  
killall: enigma2: no process killed  
minisatip is already running 如果从第二个脚本的顶部删除#!/bin/sh,就会得到预期的输出。0  
0  
It IS a number  
enigma2 is not running  
minisatip is already running  为什么这三行:#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"正确地将$ENIGMA_PID变量报告为值为0,但在第二个脚本中,相同的三行将$ENIGMA_PID变量报告为值2?更新以下是对以下评论中问题的回答。这张截图显示我运行了这两个脚本。每次minisatip进程正在运行而enigma2进程没有运行时。第一个脚本的路径是/home/root/test.sh,它只有3或4行,我可以在任何地方运行它,就像这个# test.sh一样,第二个脚本的路径是/usr/bin/enigma2.sh,正如您所看到的,我运行它就像enigma2.sh一样。正如建议的那样,我更新了这两个脚本,以从管道命令中删除wc和awk,其输出将为变量: ENIGMA_PID分配一个值。我将/home/root/test.sh改为:#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"在/usr/bin/enigma2.sh中,我将这些行添加到脚本的顶部。#!/bin/sh
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

# Check if the no_enigma file exists
...
....现在我运行了脚本,这个屏幕截图显示了输出。我正在检查的进程是一个带有路径的二进制文件: /usr/bin/enigma2 2。此二进制文件不运行。然而,当enigma2.sh脚本运行时,有两个进程ids。这是因为脚本本身称为enigma2吗?那么为什么他们的两个进程ids叫做enigma2而不是一个呢?<#>问题在此命令ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')中需要更改什么?..。当它在/usr/bin/enigma2.sh脚本中时..。所以它不算脚本,它是一个正在运行的进程的一部分?如果二进制/usr/bin/enigma2 2没有运行,则结果应为零。谢谢!Flex
    if ! [[ $ENIGMA_PID =~ $re ]] ; then
       echo "error: Not a number" >&2; exit 1
    else
        echo "It IS a number"
    fi

        if [ "$ENIGMA_PID" -gt 0 ]; then
            echo $ENIGMA_PID
            echo "$ENIGMA_PID"
            echo "enigma2 is running"
            killall enigma2
        else
            echo "enigma2 is not running"       
        fi
    # Check if minisatip is running already, if not then start it
    MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
        if [ "$MINI_PID" -gt 0 ]; then
            echo "minisatip is already running"
        else
            echo "minisatip is not running"
            echo "starting minisatip"
            /usr/bin/minisatip --satip-xml http://127.0.0.1:8554 -R /usr/share/minisatip/html       
        fi
else
    # The no_enigma file does not exist
    # Check if minisatip is running, if yes then kill it
    MINI_PID=$(ps ax|grep minisatip|grep -v grep|wc -l | awk '{print $1}')
        if [ "$MINI_PID" -gt 0 ]; then
            echo "minisatip is running, killing it now"
            killall minisatip
        else
            echo "minisatip is not running"
        fi  
    # Check if enigma2 is running already, if not then start it
    ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
        if [ "$ENIGMA_PID" -gt 0 ]; then
            echo "enigma2 is already running"
        else
            echo "enigma2 is not running"
            echo "starting enigma2"
            /home/root/run_enigma.sh            
        fi
fi

我得到这个输出..。

A3

如果从第二个脚本的顶部删除D4,就会得到预期的输出。

A5

为什么这三行:

A6

正确地将D7变量报告为值为0,但在第二个脚本中,相同的三行将D8变量报告为值2?

更新

以下是对以下评论中问题的回答。

这张截图显示我运行了这两个脚本。每次minisatip进程正在运行而enigma2进程没有运行时。

B9

第一个脚本的路径是/home/root/test.sh,它只有3或4行,我可以在任何地方运行它,就像这个D10一样,第二个脚本的路径是/usr/bin/enigma2.sh,正如您所看到的,我运行它就像D11一样。

正如建议的那样,我更新了这两个脚本,以从管道命令中删除wc和awk,其输出将为变量: ENIGMA_PID分配一个值。

我将/home/root/test.sh改为:

A12

在/usr/bin/enigma2.sh中,我将这些行添加到脚本的顶部。

A13

现在我运行了脚本,这个屏幕截图显示了输出。

B14

我正在检查的进程是一个带有路径的二进制文件: /usr/bin/enigma2 2。此二进制文件不运行。然而,当enigma2.sh脚本运行时,有两个进程ids。这是因为脚本本身称为enigma2吗?那么为什么他们的两个进程ids叫做enigma2而不是一个呢?

<#>问题在此命令D15中需要更改什么?

..。当它在/usr/bin/enigma2.sh脚本中时..。所以它不算脚本,它是一个正在运行的进程的一部分?如果二进制/usr/bin/enigma2 2没有运行,则结果应为零。

谢谢!

Flex

EN

回答 1

Unix & Linux用户

发布于 2020-05-21 05:16:12

如前所述,当从第二个脚本运行时,ps ax命令确实会产生不同的结果。

您只需要调试第二个脚本,就可以知道为什么该命令生成不同的值(并且只是为了调试目的)替换

代码语言:javascript
复制
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep|wc -l | awk '{print $1}')
echo $ENIGMA_PID
echo "$ENIGMA_PID"

使用

代码语言:javascript
复制
ENIGMA_PID=$(ps ax|grep enigma2|grep -v grep)
echo $ENIGMA_PID
echo "$ENIGMA_PID"

检查输出上有什么不同以及是什么导致了这个问题.然后相应地修改您的脚本。另外,正如注释所建议的,如果您的脚本name包含将被检测为假阳性的enigma2

票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/588000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档