问题
Is it possible to execute shell script in command line like this :
counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ] then; echo "true";
>
Above example is not working I get only >
character not the result I'm trying to get, that is "true"
When I execute ps -ef | grep -c "myApplication
I get 1 output. Is it possible to create result from single line in a script ? thank you
回答1:
It doesn't work because you missed out fi
to end your if
statement.
counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi
You can shorten it further using:
if [ $(ps -ef | grep -c "myApplication") -eq 1 ]; then echo "true"; fi
Also, do take note the issue of ps -ef | grep ...
matching itself as mentioned in @DigitalRoss' answer.
update
In fact, you can do one better by using pgrep
:
if [ $(pgrep -c "myApplication") -eq 1 ]; then echo "true"; fi
回答2:
Yes, with syntax issues fixed
That almost worked. The correct syntax is:
counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true"; fi
But note that in an expression of this sort involving ps
and grep
, the grep
will usually match itself because the characters "grep -c Myapplication" show up in the ps listing. There are several ways around that, one of them is to grep for something like [M]yapplication
.
回答3:
Other responses have addressed your syntax error, but I would strongly suggest you change the line to:
test $(ps -ef | grep -c myApplication) -eq 1 && echo true
If you are not trying to limit the number of occurrences to exactly 1 (eg, if you are merely trying to check for the output line myApplication and you expect it never to appear more than once) then just do:
ps -ef | grep myApplication > /dev/null && echo true
(If you need the variable counter set for later processing, neither of these solutions will be appropriate.)
Using short circuited && and || operators is often much clearer than embedding if/then constructs, especially in one-liners.
回答4:
I am using Mac OS and following worked very well
$ counter=`ps -ef | grep -c "myApplication"`; if [ $counter -eq 1 ]; then echo "true";fi;
true
Space is needed after [ and before ]
回答5:
I was struggling to combine both multiple lines feed into command and getting its results into a variable (not a file) and come up with this solution:
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
)
Please note that single-quotes word was substituted, because otherwise I was receiving its autosubstitution to double quotes... ksh, HP-UX.
Hopefully this will be helpful for somebody else too.
来源:https://stackoverflow.com/questions/4986109/inline-if-shell-script