/ / Ако или докато в рамките на случая командата позиционира параметрите - bash

Ако ако или докато има вътрешна линия, командата за позиционните параметри - bash

Като сравнително нов за всичко друго освен за баши скриптове, създадох скрипт

  • проверете дали процесът се изпълнява
  • извежда PID "към корпуса
  • ако не бъдете подканени от потребителя и да започнете и т.н.

Преместих се върху позиционните параметри и не мога да видя къде греша:

if [ "$1" == "" ]; then
proc_finder
elif [ $1 != "" ];then
case $1 in
-p | --process )
shift
z=$(ps aux |grep $1 |grep -v grep  > /dev/null)
if [ ! -z "$z" ]; then
echo "YES"
else
echo "NO"
fi
;;
* )
echo "Usage -p (process)"
esac
fi

Това винаги се връща yes дори когато се пускат -p test например. Знам, че съм правил нещо основно погрешно, като гледах подробния изход grep -v grep се извършва последно, затова вярвам, че винаги се връща изходно състояние от 0.

Отговори:

1 за отговор № 1

Не трябваше да е така if [ $? -eq 0 ]?

EDIT 1

Можете да опитате това:

z=`ps aux | grep $1 | grep -v grep > /dev/null`
if [ ! -z "$z" ]; then
echo "YES"
else
echo "NO"
fi

ако $z не е празна (-z: тест за нула дължина низ) това предполага, че процесът е открит с ps команда.

EDIT 2

Най- ps ... grep ... grep се пренасочва към /dev/null, Това означава z няма да съдържа нищо. премахнете пренасочването и z трябва да има известен резултат.

z=`ps aux | grep $1 | grep -v grep`

EDIT 3

Друга възможност е просто да направите това:

ps aux | grep $1 | grep -v grep > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "YES"
else
echo "NO"
fi

В този случай не записвате изхода на grep. Това е хубаво, ако нямате нужда от това.