Keresés

Részletes keresés

locsemege Creative Commons License 2009.12.09 0 0 677
A rossz példához meg annyit, hogy, te is meg NevemTeve is a -a ill. -o hozta fel annak illusztrálására, hogy miért kell az x, holott speciel ezekhez ebben az esetben nem is kell.

Így van, akkor még nem gondoltam alaposan végig, úgy tűnt, hogy ott a -a, -o operátorok problémát okoznának. Aztán amikor a konkrét példát írtam, már javítottam, olyan értéket adtam az n változónak, amely előhozza ezt a problémát.
Előzmény: DonQuijote (676)
DonQuijote Creative Commons License 2009.12.09 0 0 676
"Saját magadat csapod be, mert rossz példát írtál."
Ha azt gondolnám amit te hiszel, hogy én gondolok, akkor lehet, hogy tényleg becsapnám magam. Semmi szükség erre a stilusra.

A rossz példához meg annyit, hogy, te is meg NevemTeve is a -a ill. -o hozta fel annak illusztrálására, hogy miért kell az x, holott speciel ezekhez ebben az esetben nem is kell.

Ha valakit érdekel, közben megtaláltam választ a kérdéseimre a The Open Group Base Specifications Issue 6 Application Usage részében.
Előzmény: locsemege (675)
locsemege Creative Commons License 2009.12.09 0 0 675
Saját magadat csapod be, mert rossz példát írtál. Az első nem megy, hiszen így helyettesítődik:

if [ "kakukk" = "kakukk" -a -a y = "-a y" ]; then

Ez így hibás.

A második jó, hiszen:

if [ x"kakukk" = x"kakukk" -a x"-a y" = x"-a y" ]; then

A harmadik is jó:

if [ "kakukk" = "kakukk" -a "-a y" = "-a y" ]; then

A harmadikkal az a baj, hogy ebben a konkrét esetben ugyan jó, de általában nem. Nézzük ezt:

n="("
m="kakukk"
if [ "$m" = "kakukk" -a "$n" = "(" ]; then
echo kakukk
fi

Helyettesítés után:

if [ "kakukk" = "kakukk" -a "(" = "(" ]; then

Azaz:

if [ kakukk = kakukk -a ( = ( ]; then

Ezzel az a gond, hogy a nyitó zárójelet tényleg nyitó zárójelként értelmezi, s nincs záró párja. Viszont ha odaírod az x-et - vagy szinte bármit -, akkor:

if [ xkakukk = xkakukk -a x( = x( ]; then

Az x( viszont nem olyan karakter, amitől felizgul a test, mint valami speciálisan értelmezendő dolog. Az csak egy buta string.
Előzmény: DonQuijote (673)
locsemege Creative Commons License 2009.12.09 0 0 674
Ez így lehet, félreérthető. A vastagon szedett kódrész a SIGTERM-re példa. Elindítunk egy végtelen ciklust a háttérben önálló process-ként, utána várunk 5 másodpercet, majd ebből a szülő folyamatból küldünk a háttérben futónak egy SIGTERM-et, ezzel megölve azt a folyamatot.

A Ctrl-C pedig akkor lehet jó, ha az adott terminálunkban fut egy script, s meg akarjuk állítani. Persze lehet nyitni másik terminált, s onnan kinyiffantani a programunkat. Nézd meg az alábbi parancsok leírását:

pgrep
pkill
kill
killall
ps

Előzmény: locsemege (672)
DonQuijote Creative Commons License 2009.12.09 0 0 673
Nem értjük egymást. Azt nem értem, hogy a változó köré miért nem elég az idézőjel, miért kell még az x is. Próbáld meg ezt:

n="-a y"
m="kakukk"
if [ "$m" = "kakukk" -a $n = "-a y" ]; then
echo kakukk
fi

Nem megy.

Ez megy: if [ x"$m" = x"kakukk" -a x"$n" = x"-a y" ]; then

De ez is: if [ "$m" = "kakukk" -a "$n" = "-a y" ]; then

Akkor minek az x"$n"? Miért nem elég a "$n"?
Előzmény: locsemege (670)
locsemege Creative Commons License 2009.12.09 0 0 672
SIGINT, SIGTERM signal-okkal mindenképpen. Példa:

while :; do :; done & sleep 5; kill $!

Ha a terminálon Ctrl-C billentyűkombinációt nyomsz, az SIGINT-et küld. Más szavakkal szólva break-et.
Előzmény: F1DO (671)
F1DO Creative Commons License 2009.12.09 0 0 671
OK, köszönöm, kitisztult a dolog..

Egy más kérdésem lenne: Shellben végtelen ciklusba futott scriptet mivel lehet lelőlni?
Előzmény: locsemege (668)
locsemege Creative Commons License 2009.12.09 0 0 670
Pontosan azért, mert az idézőjel egybetartotta a stringet, és -a x operátor meg nincs, tehát azt az elvártak szerint értelmezte a test. Nem ez az eset az érdekes, hanem az, amikor a változó helyére mondjuk az helyettesítődik, hogy -a.
Előzmény: DonQuijote (669)
DonQuijote Creative Commons License 2009.12.09 0 0 669
Jó, az elméletet ismerem, a konkrét kérdés az, hogy ha az igaz, akkor vajon ez miért működik idézőjellel (anélkül jön az elvárt too many arguments):

n="-a x"
m="kakukk"
if [ "$m" = "kakukk" -a "$n" = "-a x" ]; then
echo kakukk
fi
Előzmény: locsemege (667)
locsemege Creative Commons License 2009.12.09 0 0 668
Hát nem könnyű Veled! :) Elmagyarázom, hogy logikailag nem jó a feltétel, azt is miért, erre leírod ugyanazt valamiféle metanyelven. Mert ugye ez így a bash-nek szintaktikai hiba lesz. A shellnek nincs -o operátora. (Viszont van neki olyanja, hogy ||.)

Leírom a konstansok behelyettesítésével, hátha világos lesz.

n=elso
if [ x"$n" != x"elso" -o x"$n" != x"masodik" -o x"$n" != x"harmadik" ]; then


Helyettesítés után:

n=elso
if [ x"elso" != x"elso" -o x"elso" != x"masodik" -o x"elso" != x"harmadik" ]; then


Mi is lesz ez? Immáron metanyelven:

Ha ( hamis VAGY igaz VAGY igaz), akkor

Tehát

Ha (igaz), akkor

A bökkenő az, hogy ez a kifejezés a változó értékétől függetlenül mindig igaz értéket ad. Miért?

Azért, mert ha egyik konstanssal - elso, masodik, harmadik - sem egyenlő a változód - legyen mondjuk a változód értéke kilencedik -, akkor mindhárom tag értéke igaz, ezek VAGY kapcsolata igaz. Ha az egyik konstansoddal azonos a változód, az a tag ugyan hamis lesz, de ekkor a változód a másik két konstansoddal garantáltan nem egyezik, így a másik két tag igaz lesz, ezek VAGY kapcsolata szintén igaz lesz. Tehát ha a fejed tetejére állsz, akkor sem tudsz olyan változó értéket megadni ebben a kifejezésben, hogy mindhárom tag hamis legyen, s ezzel ezek VAGY kapcsolata is hamis legyen. A kifejezésed elvi hibás volt, azért nem működött. De korábbi hozzászólásomban leírtam a helyes megoldást is. :)
Előzmény: F1DO (663)
locsemege Creative Commons License 2009.12.09 0 0 667
Ugyan nem engem kérdeztél, de azért nem elég, mert ha a $n változó mondjuk a -o stringet tartalmazza, édesmindegy, hogy idézőjelbe teszed, vagy sem, akkor oda a shell a -o stringet helyettesíti. Az idézőjel arra jó, hogy szóközök mentén ne essen szét több paraméterre a string, azaz a szóköz a string része maradjon, ne pedig a paramétereket termináló karakter.

Ebből persze nem következik, hogy mindenhova kell az idézőjel, hiszen lehet olyan, hogy azt szeretnénk, hulljon szét paraméterekre a string a szóközök mentén.
Előzmény: DonQuijote (664)
DonQuijote Creative Commons License 2009.12.08 0 0 666
Meg az x-eket is kihagytad, meg a zárójeleket is rossz helyre tetted...
Előzmény: F1DO (665)
F1DO Creative Commons License 2009.12.08 0 0 665
Oppábocsánat az idéző jeleket kihagytam..

if [x"$n" != "elso"] -o [x"$n" != "masodik"] -o [x"$n" != "harmadik"]



és hjja tényleg, akkor megint generálódik egy új kérdés hogy hát az idézőjelek miért kellenek, mire szolgálnak ezesetben???
Előzmény: F1DO (663)
DonQuijote Creative Commons License 2009.12.08 0 0 664
Ha idézőjelek között van a változó, az miért nem elég?
Előzmény: NevemTeve (660)
F1DO Creative Commons License 2009.12.08 0 0 663
Hát hmm...

if [x$n != "elso"] -o [x$n != "masodik"] -o [x$n != "harmadik"]


így már okés lenne a dolog? (most perpill nem tudom kipróbálni, futtatni, így kérdezek)
Előzmény: locsemege (662)
locsemege Creative Commons License 2009.12.08 0 0 662
Ja, meg például a zárójel is kellemetlen lenne. (Egy apró javítás: $n).
Előzmény: NevemTeve (660)
locsemege Creative Commons License 2009.12.08 0 0 661
Azért konstans true a kifejezés értéke, mert ha $n bármelyik konstansoddal egyezik - pl. elso -, akkor garantáltan nem egyezik a másik kettővel. Mivel nem egyezésre vizsgálsz, azok igazak lesznek, s ezek OR kapcsolata is igaz lesz. Tehát n=elso esetén a VAGY kapcsolat első tagja false, de elso != masodik már true, ezáltal az egész kifejezés true. Az egész kifejezés csak úgy lehetne false, ha minden tagja false, az viszont sohasem teljesülhet.

A helyes megoldás az ÉS kapcsolat lenne:

if [ x"$n" != x"elso" -a x"$n" != x"masodik" -a x"$n" != x"harmadik" ]; then

Illetve De Morgan bácsit segítségül hívva:

if ! [ x"$n" = x"elso" -o x"$n" = x"masodik" -o x"$n" = x"harmadik" ]; then

Ez utóbbi alak talán közelebb áll a mindennapi gondolkodáshoz. Ha bármelyik szót eltaláltuk, az jó, tehát ennek ellenkezője esetén kell kiírnunk, hogy rossz a megadott paraméter.
Előzmény: F1DO (659)
NevemTeve Creative Commons License 2009.12.07 0 0 660
Ha nagyon kegyetlenek az istenek, és az van az $x változóban, hogy -o, akkor azzal sikerülne jól összezavarni a kifejezés-kiértékelést, ha nem tennék elé egy semlegesítő prefixet (x-et).
Előzmény: F1DO (659)
F1DO Creative Commons License 2009.12.07 0 0 659
Visszatérve a dologra, még értetlenkednék egy kicsit...

Szóval:
if [ x"$n" != x"elso" -o x"$n" != x"masodik" -o x"$n" != x"harmadik" ];

azaz, ha beadott értéke $n-nek nem "elso" vagy nem "masodik" vagy nem "harmadik" akkor lefut a then ág.
ha a beadott érték mondjuk "elso", akkor a feltétel kiértékelődése hamis lesz, hiszen nem igaz, hogy a három feltétel értékből nem egyezik valamivel, mert egyezik az "elso"-vel tehát az else ágnak kéne lefutnia nem?


a másik amire eddig nem is kérdeztem, hogy az x-et miért is kellett 'belekeverni' a feltételvizsgálatba??
Előzmény: locsemege (658)
locsemege Creative Commons License 2009.12.07 0 0 658
Az if-nek az a baja, hogy rossz feltételt adtál meg. Mindig igaz lesz, gondold csak végig! :))
Előzmény: F1DO (654)
F1DO Creative Commons License 2009.12.07 0 0 657
until-al triviális a megoldás..

Bekéri addig a read részt amig a feltétel igaz nem lesz.
Köszönöm a segítséget! Minden ok. Müködik a script.
Előzmény: F1DO (655)
locsemege Creative Commons License 2009.12.07 0 0 656
Persze. Shell globbing.

case "$n"
elso) parancs1;;
masodik) parancs2;;
harmadik) parancs3;;
*) ha_egyik_sem_parancs;;
esac
Előzmény: F1DO (653)
F1DO Creative Commons License 2009.12.07 0 0 655
Egyúttal tökéletes úgy lenne, ha mondjuk addig futna az adatbekérés, mígnem a helyes értékek valamelyik meg nem adjuk.

Az alábbi kódot while-ra írva az if helyett..
Előzmény: F1DO (654)
F1DO Creative Commons License 2009.12.07 0 0 654
Igen van, megtaláltam a leírásban..

Végülis így is jó, és pofonegyszerű...

Ellenben az if-es dolgot még nem értem..
Előzmény: F1DO (653)
F1DO Creative Commons License 2009.12.07 0 0 653
Avagy esetleg a case-nek van 'else' ága?

Azaz hogy ha a felsorolt értékek egyikének sem felel meg a bevitt érték akkor azt a standart parancsot hajtsa végre?
Előzmény: F1DO (652)
F1DO Creative Commons License 2009.12.07 0 0 652
Megtettem.
Most pedig állandóan az else ág fut le... még akkor is ha helyes case értéket adok.
(ami eddig működött.. kezdek őszülni.. ) :

read n
if [ x"$n" != x"elso" -o x"$n" != x"masodik" -o x"$n" != x"harmadik" ]; then
echo "Elgepeles"
else
case $n in
"elso") echo"megjelenites"
;;
"masodik") echo "masik kiiras"
;;
"harmadik") echo "harmadik kiiras"
;;
esac
fi
Előzmény: locsemege (649)
locsemege Creative Commons License 2009.12.07 0 0 651
További észrevételem, hogy a != valamint -o stringek a shell szempontjából nem operátorok, hanem paraméterek, amelyeket átad a [ parancsnak. A [ parancs persze mint operátort fogja értelmezni ezeket, mégpedig az alapján, hanyadik paraméterként kapta meg.
Előzmény: locsemege (650)
locsemege Creative Commons License 2009.12.07 0 0 650
Lehet, hogy meglepő, de a szögletes zárójel egy parancs, melynek paraméterei vannak. Nézd csak meg:

which [
/usr/bin/[

Más kérdés, hogy egyben a shell belső parancsa is.

Írhatnád így is:

if test x"$n" != x"elso" -o x"$n" != x"masodik" -o x"$n" != x"harmadik"; then
Előzmény: F1DO (648)
locsemege Creative Commons License 2009.12.07 0 0 649
[bevitt_írás_mindegymi

Mert tényleg nincs olyan parancs, én megértem a shell-t. Másold copy-paste-tel, amit írtam, ha már figyelmetlen vagy! :(

Hogy is néz ki egy bash parancs?

parancs paraméter1 paraméter2 paraméter_sok

Nem pedig:

parancsparaméter1paraméter2paraméter_sok

Hiszen ez utóbbi egy szó, azaz egy hosszú nevű parancs paraméterek nélkül. A paramétereket a szóköz szeparálja.
Előzmény: F1DO (648)
F1DO Creative Commons License 2009.12.07 0 0 648
Köszönöm a segítséged elsősorban.

Azonban - kipróbálva a beírt mindkét if-es sort is- mindig ugyanazt a hibát kapom:
"line4:[bevitt_írás_mindegymi: command not found" -ot dob.

A shell futtatásakkor ha a bevitt érték a case kitételeknek megfelel, akkor végrehajtódnak, (ugyanígy előtte azért dobja a fenti hibaüzenetet ilyenkor is) ha nem felel meg akkor ugyanazzal a hibaüzenettel nem történik semmi (holott a then ágnak végre kéne hajtódnia).

tehát valamiért az if-then téma nem tetszik neki, avagy a beolvasás nem jó neki valamiért. (a beolvasás és az if közötti kapcsolat-ra gondolok)

Próbáltam while-al, until-al mindegyiknél ugyanez a gond bármit is csinálok.
Valahol a read-el lehet gond, csak megtévesztő, mert az if-es rész után a case rész ugyanakkor lefut..
Előzmény: locsemege (644)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!