【问题标题】:Inline if shell script内联 if shell 脚本
【发布时间】:2011-06-26 13:06:04
【问题描述】:

是否可以像这样在命令行中执行 shell 脚本:

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ] then; echo "true";
>

上面的例子不起作用我只得到> 字符而不是我想要得到的结果,那是“真”

当我执行 ps -ef | grep -c "myApplication 时,我得到 1 个输出。是否可以从脚本中的单行创建结果?谢谢你

【问题讨论】:

  • 你需要; then 而不是then;

标签: linux shell scripting sh


【解决方案1】:

这不起作用,因为您错过了 fi 来结束您的 if 语句。

counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi

您可以使用以下方法进一步缩短它:

if [ $(ps -ef | grep -c "myApplication") -eq 1 ]; then echo "true"; fi

另外,请注意ps -ef | grep ... 匹配自身的问题,如@DigitalRoss' answer 中所述。

更新

事实上,使用pgrep 可以做得更好:

if [ $(pgrep -c "myApplication") -eq 1 ]; then echo "true"; fi

【讨论】:

  • if pgrep myApplication 2>/dev/null; then ... 不需要括号或命令替换。 “m”周围的括号也不需要,因为 pgrep 不匹配自己,除非你告诉它。
  • 如果他想精确匹配一个实例,那将是不准确的。关于 pgrep 不匹配自我的好点。更新示例。谢谢。
  • 第一个代码示例中then后面的半色是不是放错地方了?
  • -c for pgrep 至少对于 procps 的 3.2.8 版本不是有效的开关。在我的情况下它不起作用......
【解决方案2】:

其他回复已解决您的语法错误,但我强烈建议您将行更改为:

测试 $(ps -ef | grep -c myApplication) -eq 1 && echo true

如果您不尝试将出现次数限制为 1(例如,如果您只是尝试检查输出行 myApplication 并且您希望它永远不会出现超过一次),那么只需执行以下操作:

ps -ef | grep myApplication > /dev/null && echo true

(如果您需要为以后的处理设置变量计数器,这些解决方案都不合适。)

使用短路的 && 和 ||运算符通常比嵌入 if/then 结构要清晰得多,尤其是在单行中。

【讨论】:

    【解决方案3】:

    是的,已修复语法问题

    几乎奏效了。正确的语法是:

    counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi
    

    但请注意,在涉及psgrep 的此类表达式中,grep 通常会匹配自身,因为字符“grep -c Myapplication”出现在 ps 列表中。有几种方法可以解决这个问题,其中之一是使用 grep 查找类似 @​​987654325@ 的内容。

    【讨论】:

      【解决方案4】:

      我正在使用 Mac OS 并且以下工作非常好

      $ counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true";fi;
      

      是的

      [ 之后和之前需要空格

      【讨论】:

        【解决方案5】:

        我正在努力将多行输入合并到命令中并将其结果放入变量(而不是文件)并提出这个解决方案:

            FRA_PARAM="'db_recovery_file_dest'"
            FRA=$(
            sqlplus -S "/as sysdba" <<EOF
        set echo off head off feed off newpage none pages 1000 lines 1000
        select value from v\$parameter where name=$FRA_PARAM;
        exit;
        EOF
                )
        

        请注意,单引号单词已被替换,否则我会收到它对双引号的自动替换...ksh,HP-UX。

        希望这对其他人也有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 2010-10-15
          • 2014-01-15
          相关资源
          最近更新 更多