【问题标题】:While Do Statement with blank/empty grep return?带有空白/空 grep 的语句是否返回?
【发布时间】:2011-12-16 21:29:23
【问题描述】:

这是我的 foobar.sh 的代码:

!#/bin/bash
while [ 1 ]
do
    pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`
    echo $pid
    if [ "$pid"="" ]
    then
            echo "Process has ended lets get this show on the road..."
            exit
    else
            echo "Process has not ended yet"
    fi
    sleep 6
done

我基本上是在运行一个无限循环,一旦受监控的进程结束,它将执行命令 X,但我最终在脚本循环时收到以下消息:

./foobar.sh: line 7: [: missing `]'
Process has not ended yet

有没有办法让脚本接受零反馈将触发我的“Then”语句并执行命令 X,因为它不喜欢当前的方法。

【问题讨论】:

    标签: bash shell while-loop if-statement


    【解决方案1】:

    代替

    if [ "$pid"="" ]
    

    请尝试

    if [ "$pid" = "" ]
    

    = 周围的空格很重要。

    你也可以试试

    if [ -z "$pid" ]
    

    【讨论】:

      【解决方案2】:

      我愿意

      while pgrep -fl "mylittleprogram"; do sleep 6; done
      exit # process has ended
      

      (pgrep 在包psmiscIIRC)

      我刚刚测试过了。如果您希望等待保持沉默,您可以将pgrep 的输出重定向到/dev/null。添加更多香料以使事情不间断:

      {
           trap "" INT
           while pgrep -fl "mylittleprogram" >/dev/null
           do 
               sleep 6
           done
           true
      } && exit
      

      【讨论】:

        【解决方案3】:

        零测试是if [ -z "$pid" ]

        【讨论】:

          【解决方案4】:

          而不是由以下提供的模糊匹配:

          pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`
          

          ...以及古老的反引号语法,请考虑与进程基本名称完全匹配并生成您选择的输出格式(此处为进程 pid,如果存在):

          pid=$(ps -C mylittleprogram -opid=)
          

          然后,如上所述,只需测试一个空值:

          [ -z "${pid" ] && echo "no process" || echo "I live as $pid"
          

          输出元素名称后面的等号会隐藏您通常会得到的标题。联机帮助页是您的朋友。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-17
            • 2020-07-15
            • 2016-02-27
            • 1970-01-01
            • 2016-05-21
            • 2018-08-26
            • 2020-05-23
            • 1970-01-01
            相关资源
            最近更新 更多