内联如果是shell脚本

时间:2011-02-13 18:48:45

标签: linux shell scripting sh

是否可以在命令行中执行shell脚本,如下所示:

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

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

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

5 个答案:

答案 0 :(得分:52)

它不起作用,因为您错过了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

另外,请注意@DigitalRoss' answer中提及的ps -ef | grep ...匹配问题。

更新

事实上,您可以使用pgrep

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

答案 1 :(得分:6)

是的,修复了语法问题

几乎有效。正确的语法是:

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

但请注意,在涉及psgrep的此类表达式中,grep通常会匹配自身,因为字符“grep -c Myapplication”会显示在ps列表中。有几种方法,其中之一是grep for [M]yapplication

答案 2 :(得分:5)

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

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

如果您没有尝试将出现次数限制为1(例如,如果您只是想检查输出行myApplication,并且您希望它永远不会出现多次),那么就这样做:

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

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

使用短路&&和||运算符通常比嵌入if / then结构更清晰,特别是在单行中。

答案 3 :(得分:1)

我正在使用Mac OS,后续工作非常好

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

在[及之前]

之后需要空格

答案 4 :(得分:0)

我一直在努力将多行输入结合到命令中并将其结果转换为变量(而不是文件)并提出此解决方案:

    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。

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