Strona 1 z 1

bash, porównanie zmiennych z komendy

: 23 sierpnia 2021, 11:40
autor: superserek

Kod: Zaznacz cały

COUNT= pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]"
ILE=0
declare -x COUNT
echo $COUNT
 
if [[ "$COUNT" == "$ILE" ]]
then
   echo "jest 0"
else
    echo "nie ma"
fi
Dlaczego zawsze jest "nie ma" skoro COUNT wynosi 0

Re: bash, porównanie zmiennych z komendy

: 23 sierpnia 2021, 17:48
autor: lizard
COUNT= pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]" - brakuje otaczających odwróconych apostrofów ('`'):

Kod: Zaznacz cały

COUNT=`pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]"`
Poza tym wc, tr są niepotrzebne:
man pgrep pisze:

Kod: Zaznacz cały

       -c, --count
              Suppress  normal  output; instead print a count of matching pro‐
              cesses.  When count does not match anything, e.g. returns  zero,
              the command will return non-zero value.

Re: bash, porównanie zmiennych z komendy

: 24 sierpnia 2021, 09:04
autor: LordRuthwen
lizard pisze: 23 sierpnia 2021, 17:48 COUNT= pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]" - brakuje otaczających odwróconych apostrofów ('`'):

Kod: Zaznacz cały

COUNT=`pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]"`
Ewentualnie notacja może być taka:

Kod: Zaznacz cały

COUNT=$(POLECENIE DO WYKONANIA|COŚTAM)

Re: bash, porównanie zmiennych z komendy

: 24 sierpnia 2021, 21:49
autor: lizard
Zapis "$(...)" jest nowszy i zalecany, podczas gdy "`...`" - przestarzały. Ten drugi jednak cały czas jest implementowany w powłokach ze względów historycznych i wciąż używany. Przewagą pierwszego jest możliwość zagnieżdżeń. Obydwa zapisy są zgodne ze standardem POSIX.

Re: bash, porównanie zmiennych z komendy

: 27 sierpnia 2021, 20:30
autor: marcin1982
superserek
Pozrzędzę trochę o sprawach technicznych. Rozumiem, że się uczysz, ale po co skrypt ma wykonywać niepotrzebną robotę i robić rzeczy naokoło?
COUNT= pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]"
Uzupełnienie tego, co podał kolega LordRuthwen:

Kod: Zaznacz cały

COUNT="$(pgrep -x "Opera" | wc -l | tr -d "[:blank:]|[:space:]")"
Ten fragment jest niepotrzebny:

Kod: Zaznacz cały

wc -l | tr -d "[:blank:]|[:space:]"
Komenda wc -l liczy linie z poprzedniego polecenia przed "rurą", dostajesz liczbę całkowitą. Nie ma z czego usuwać spacji i znaków tzw. białych. Po drugie "space" zawiera się w klasie "blank":
https://www.regular-expressions.info/posixbrackets.html .
ILE=0
declare -x COUNT
Te dwie rzeczy są niepotrzebne. Nie musisz dodatkowo deklarować zmiennej, ona już istnieje w tym skrypcie, została zdefiniowana. Po drugie - jeśli procesy Opery istnieją, dostaniesz ich listę. Jeśli nie ma, wynik będzie pusty.
Jeśli zrezygnujesz z liczenia (wc -l), można odpuścić w ogóle ubieranie tego w zmienną tylko wsadzić do warunku - reszta zależy od sygnału procesu "0" sukces - lub "1" błąd. Inna sprawa, że pgrep może zrobić to samo za pomocą własnej opcji. Jeszcze inaczej - masz pidof -s, on zwróci pojedynczy proces ... Możliwości jest od groma. Jak to skrócić? Komunikaty po echo są nielogiczne - jest ZERO procesów, czyli ich nie ma.

Reasumując, wersja ze zmienną:

Kod: Zaznacz cały

#!/bin/bash
# set -x
COUNT="$(pgrep -x firefox -c)"

if ! [[ "$COUNT" == "0" ]]; then
  echo "Jest"
else
  echo "Nie ma"
fi
Wersja bez zmiennej:

Kod: Zaznacz cały

#!/bin/bash
# set -x

if [ "$(pidof -s chromium)" ]; then
  echo "Jest"
else
  echo "Nie ma"
fi