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
- 1938 megtekintés
Hozzászólások
Hagyd kicsit szellőzni:
if [ "$friss" == "$friss2" ]
- A hozzászóláshoz be kell jelentkezni
sajna nem jó
demo.sh: 32: [: 17:45:00: unexpected operator
- A hozzászóláshoz be kell jelentkezni
Fura itt lefut:
#!/bin/bash
friss=$(cat /home/osmc/friss.txt)
friss2=$(cat /home/osmc/friss2.txt)
echo $friss
echo "$friss2"
if [ "$friss" == "$friss2" ]
then
echo 1
else
echo 2
fi
osmc@osmc:~$
./cv.sh
17:45:00
17:45:00
1
./cv.sh
17:45:00
18:45:00
2
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
eredmény ez ha a két string egyenlő
diff: 17:45:00: No such file or directory
diff: 17:45:00: No such file or directory
1
eredmény ez ha a két string különböző
diff: 17:45:00: No such file or directory
diff: 18:45:00: No such file or directory
1
- A hozzászóláshoz be kell jelentkezni
Mert a diff két fájlnevet és nem két stringet vár, ahogy azt a $file1 és $file2 változónevekkel jelezni szándékoztam. (Egyébként most nézem, elfelejtettem beidézőjelezni.)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
kipróbáltam, hogy fájlként hivatkozom rá és változóként :) köszi működik :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni