[MEGOLDAVA]Két string összehasonlítás

Sziasztok

Lenne egy olyan problémám, hogy két string változót szeretnék összehasonlítani bash-ban. A lényeg ha különbözik akkor teljesül az else ág.

ilyen formátumúak a stringek amit txt-ből olvasok ki: 15:15:00

ezekkel próbáltam

friss=$(cat /home/pepe/demo/frisss.txt)
friss2=$(cat /home/pepe/demo/frisss2.txt)
echo $friss
echo "$friss2"
if [$friss == $friss2]
then
echo 1
else
echo 2
fi

itt mindig ez az eredmény minden esetben

demo.sh: 31: demo.sh: [15:15:00: not found
2

if [diff $friss $friss];
then
sh proba2.sh
friss=$(cat /home/pepe/idojaras/frisss.txt)
friss2=$(cat /home/pepe/idojaras/frisss2.txt)

itt az eredmény:

demo.sh: 37: demo.sh: [diff: not found

viszont ha simán cliben futtatom és a kát fájl u.a. akkor az eredmény semmi a különbözik akkor

1c1
< 15:15:00
---
> 16:15:00

Hozzászólások

Hagyd kicsit szellőzni:


if [ "$friss" == "$friss2" ]

Nem jó, mert vagy nem a bash az alapértelmezett interpreter ott, ahol ezt csinálod, vagy nem az szerepel a szkripted első sorában, hogy

#!/valami/eleresi/ut/bash

miáltal nem a bash fogja futtatni a szkriptedet, hanem az az egyéb alapértelmezett/megadott interpreter, ami nem tudja (fentebb jelezték), hogy mit is akarsz azzal a két "=" jellel ott, ahol legfeljebb egyet vár.

Szóval csak azt hiszed, hogy a bash az, amivel a sztringeket összehasonlítod, pedig nem, illetve ha mégis a bash mint bináris kód az, ami fut, akkor kompatibilis (a.m.: lebutított) üzemmódban dolgozik - ha ez se, az se, akkor az egy nagyon-nagyon régi bash, és ott vár az egyik szekrényben a tavalyi ősz sztárja, a shellshock nevű csontváz.

man test:


       STRING1 = STRING2
	      the strings are equal

       STRING1 != STRING2
	      the strings are not equal

Ha mindenképp diffet szeretnél használni, akkor az valahogy így lenne:


if ! $(diff $file1 $file2 > /dev/null); then
	echo 1
else
	echo 2
fi

Az idézőjel egy dolog, az vadabb, hogy az stdout-ot elküldöd null device-ra, de az if-be helyettesíted a kimenetet. Az a $() nem kell oda. Így lehetett volna:

if ! diff <(echo "$var1") <(echo "$var2") >/dev/null; then

Ami persze string összehasonlításra elég nyakatekert és erőforrás-igényes elképzelés. :) Ráadásul a process substitution nevű konstrukciót nem minden shell ismeri, a bash éppen igen.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

bourne kompatibilis shellben az egyenlőség az "=" nem pedig "==", tehát:


if [ "$friss" = "$friss2" ]
then
  echo 1
else
  echo 2
fi

az idézőjelezés pedig jelen esetben szükséges.