Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Linux 变量的IF运算_Linux_Bash_If Statement - Fatal编程技术网

Linux 变量的IF运算

Linux 变量的IF运算,linux,bash,if-statement,Linux,Bash,If Statement,我正在bash中构建一个脚本,用于Linux(sles11sp3)。我想通过使用以下语法查找某个进程的pid来检查该进程是否存在: pid="$(ps -ef | grep -v grep | grep /sbin/syslog-ng | awk '{print $2}')" 这将用syslog ng进程的pid填充变量pid。然后我想在if语句中使用此变量: if [ ${pid} > 0 ]; then do something else do something else

我正在bash中构建一个脚本,用于Linux(sles11sp3)。我想通过使用以下语法查找某个进程的pid来检查该进程是否存在:

pid="$(ps -ef | grep -v grep | grep /sbin/syslog-ng | awk '{print $2}')"
这将用syslog ng进程的pid填充变量pid。然后我想在if语句中使用此变量:

if [ ${pid} > 0 ]; then
  do something
else
  do something else
fi
if (( pid > 0 )); then
  do something
else
  do something else
fi
问题在于,即使变量pid的值大于0,该if语句似乎总是错误的。因此,始终执行else部分,而不是正确的(如果条件为true)语句

在使用wc-l检查文件系统是否存在时,我遇到了类似的问题:

exist_tmp=$(df -x fuse.gvfs-fuse-daemon -h | grep /tmp | wc -l)
if [ ${exist_tmp} > 0 ]; then
  do something
fi
即使变量的值为1(表示存在a/tmp文件系统),这也不起作用。当我将语法更改为以下内容时,它开始工作(或者至少做我希望它做的事情):

if [ ${exist_tmp} != 0 ]; then
  do something
fi
在这个用例中,大于0和不等于0之间的差异让我有点摸不着头脑

有关问题如下:

  • 有人知道为什么pid查找和if语句不能执行我希望它执行的操作吗
  • 有人知道>0和!=0可能是

  • 非常感谢您的任何意见

    对于bash,比较如下:!=用于按字典顺序比较字符串。要比较它们的整数值,请执行以下操作>:

    if [ "$a" -gt "$b" ]
    
    if [ "$a" -ne "$b" ]
    
    还有这样的不平等:

    if [ "$a" -gt "$b" ]
    
    if [ "$a" -ne "$b" ]
    

    有关更多详细信息或其他比较器,请参阅。

    ps-ef | grep-v grep | grep/sbin/syslog ng | awk'{print$2}'可以计算多行。你需要选一个。要选择第一个,请附加
    头-n1

    ... | awk '{print $2}' | head -n 1
    

    第二个示例之所以有效,是因为
    wc-l
    总是在一行上返回一个数字。

    如果要比较整数,最好使用算术If语句:

    if [ ${pid} > 0 ]; then
      do something
    else
      do something else
    fi
    
    if (( pid > 0 )); then
      do something
    else
      do something else
    fi
    

    获取进程PID的一种简单方法是使用
    pgrep

    pid=$(pgrep -fo /sbin/syslog-ng)     # oldest
    pid=$(pgrep -fn /sbin/syslog-ng)     # newest
    pids=($(pgrep -f /sbin/syslog-ng))   # an array of pids
    
    如果可能有多个进程正在运行,则应使用
    -o
    -n
    分别选择最旧或最新的进程。或者您可以更改脚本以保存并使用所有PID

    for pid in "${pids[@]}"; do
        ...
    done
    
    然后要比较数字,您应该使用方括号中的
    -gt
    -lt
    ,或者切换到用于算术比较的
    (…)

    if ((pid > 0))         # great
    if [[ $pid -gt 0 ]]    # good
    if [ "$pid" -gt 0 ]    # meh
    
    如果使用数组方法,那么将循环所有PID

    for pid in "${pids[@]}"; do
        ...
    done
    

    事实上,如果您的目标只是测试进程是否存在,那么您可以跳过获取PID并测试
    pgrep
    的退出代码

    if pgrep -f /sbin/syslog-ng > /dev/null; then
        # process exists
    fi
    

    尝试-gt而不是>前者比较整数,后者比较字符串。pgrep可以帮助您减少脚本
    [
    是一个命令。
    是一个重定向。
    cmd argument>0
    将cmd的输出重定向到名为
    0
    的文件。
    [${exist\u tmp}>0]
    因此,任何来自“wc l”的内容或者进程ID的grep应该与“-gt”和“-ne”类型的运算符进行比较?我使用的运算符用于字符串比较。这是正确的。为了澄清,所有bash值都是字符串-但是如果字符串只包含数字,并且要比较其整数值,则应该使用-gt,-ne等。我注意到一件奇怪的事情:while
    pid=$(ps-ef | grep-v grep | grep/sbin/syslog ng | awk'{print$2}')
    将在命令提示符下工作(如果我
    echo$pid
    它将给我一个数字),它将在脚本中使用时返回一个空变量(当我跟踪该变量填充的部分时看到了这一点)。有什么想法吗?