bash, porównanie zmiennych z komendy

Potrzebujesz pomocy z C, C++, perl, python, itp.
superserek
Posty: 50
Rejestracja: 12 marca 2019, 12:19

bash, porównanie zmiennych z komendy

Post autor: superserek » 23 sierpnia 2021, 11:40

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

Awatar użytkownika
lizard
Beginner
Posty: 288
Rejestracja: 08 lutego 2016, 18:47

Re: bash, porównanie zmiennych z komendy

Post autor: lizard » 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:]"`
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.
Ostatnio zmieniony 28 sierpnia 2021, 14:11 przez lizard, łącznie zmieniany 1 raz.

Awatar użytkownika
LordRuthwen
Moderator
Posty: 2231
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Re: bash, porównanie zmiennych z komendy

Post autor: LordRuthwen » 24 sierpnia 2021, 09:04

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)

Awatar użytkownika
lizard
Beginner
Posty: 288
Rejestracja: 08 lutego 2016, 18:47

Re: bash, porównanie zmiennych z komendy

Post autor: lizard » 24 sierpnia 2021, 21:49

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.

Awatar użytkownika
marcin1982
Moderator
Posty: 1726
Rejestracja: 05 maja 2011, 12:59
Lokalizacja: Zagłębie Dąbrowskie

Re: bash, porównanie zmiennych z komendy

Post autor: marcin1982 » 27 sierpnia 2021, 20:30

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

ODPOWIEDZ