Nem tudom létezik-e a bash-ban a régi basic-nak megfelelő subrutin lehetőség.
Tehát adva vagyon egy script, melyben kétszer kell szinte ugyanazt lefuttatni. Azért szinte, mert a 15 sorból három különbözik csak a második 15 sor esetében.
S hát ugye nem szép kétszer ugyanazt látni egy scriptben.
De nem egy másik fájlt szeretnék meghívni, hanem a scripten belül kellene elintézni a dolgot.
Ez nem jött be:
function suBRutin {
1 sor blabla
13 sor blabla
}
suBRutin
14 sor
15 sor
blabla blabla
blabla
suBRutin
14 sor
15 sor
- 1460 megtekintés
Hozzászólások
Bedöglött a google? http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions
- A hozzászóláshoz be kell jelentkezni
WORKSFORME:
#!/bin/bash
function foo {
echo "Footest"
}
foo
echo "14 sor"
echo "15 sor"
foo
echo "14 sor"
echo "15 sor"
- A hozzászóláshoz be kell jelentkezni
Pedig úgy kell. Tehát shell-függvényt 2-féle szabályos* szintaxissal lehet csinálni:
fv1() {
itt
vannak
a
parancsok
}
function fv2 {
meg
itt
is
}
Meghívni ugyanúgy kell őket, simán a nevükkel:
fv1
fv2
(*) Van egy bash-ban előszeretettel használt harmadik forma. Két hátránya is van: többet kell gépelni akár az első, akár a második formánál; ráadásul csak bash-ban megy az a szintaxis, semmilyen elterjedt shellnél nem. Ez nyilván Linux alatt látszólag nem tétel, de lehet gondolni a Debian-féle bash -> dash váltásra, és kiderül, hogy megéri "konzervatívan" programozni. És végül - érdemes az első formát használni (ez még a másodiknál is konzervatívabb, még több shell-lel kompatibilis forma).
- A hozzászóláshoz be kell jelentkezni
Nos ez nekem valami miatt nem jön össze:
Elkészítettem az alábbi formát:
suBRutin () {
parancsok
egyebek
}
If A=A; then
suBRutin
14 sor
15 sor
else
suBRutin
valami más sor
valami más sor
fi
Az a helyzet hogyha A=x, az else ág nem hajtódik végre.
Amint a subRutin hivatkozások helyére a sok sort másolom be akkor nyomban jó lesz.
- A hozzászóláshoz be kell jelentkezni
nem értek hozzá egyáltalán, azért kérdem, ezeket a függvényeket paraméterezni már nem lehet?
- A hozzászóláshoz be kell jelentkezni
De, ugyanugy atadhato parameter egy shell-fv-nek, ahogy egy shell-script-nek is, es raadasul pontosan ugyanugy kell a shell-fv-ek parameteret kezelni, ahogy shell-script parameteret kell (azaz $1, $2, stb).
fv() {
echo "$1" volt az elso parameter
}
fv a b c d
kimenete
a volt az elso parameter
- A hozzászóláshoz be kell jelentkezni
> If A=A; then
He?
- A hozzászóláshoz be kell jelentkezni
Jaj Istenem - egyszerűsítettem.
Berakjam az egész scriptet?
Bár lehet hogy túl is egyszerűsítettem.
Itt van belőle az ominózus részlet.
http://pastebin.com/m7eff8b81
- A hozzászóláshoz be kell jelentkezni
> Jaj Istenem - egyszerűsítettem.
Értem én hogy egyszerűsítés, de miért raktál bele szintaktikai hibákat?
Na, ilyen egy _rendes_ egyszerűsítés:
#!/bin/bash
suBRutin () {
echo suBRutin
}
if A=A ; then
echo 'then'
suBRutin
else
echo 'else'
suBRutin
fi
Teljes, futtatható kód, a futtatás hibája/helyessége az echo-zott szöveggel ellenőrizhető.
Irgumburgum.
- A hozzászóláshoz be kell jelentkezni
if test A = A
vagy
if [ A = A ]
esetleg (ksh)
if [[ A = A ]]
--
When in doubt, use brute force.
- A hozzászóláshoz be kell jelentkezni
Az már csak hab a tortán, hogy ezeket a függvényeket teheted egy külön file-ba, legyen pl. math.sh, és akkor source-olhatod. Így elég egyszer megírni valamit, és utána már több helyen is használhatod, pláne ha elteszed cvs-be, svn-be vagy valami hasonlóba.
Én spec. az svn-t használom, ott megadom external-ként, és minden remek.
- A hozzászóláshoz be kell jelentkezni
Rettentő kevés lehetőséget adsz arra, hogy segítsünk. Az "Ez nem jött be"-ből nem derült ki, hogy mi a hiba, illetve amit te beírtál az teljesen értelmetlen.
Itt egy működő, gyakorlati példa:
#!/bin/bash
function Compress()
{
echo "Compress $1"
if [ -f "$1.gz" ]
then
rm "$1.gz"
fi
nice gzip "$1"
}
function DumpDB()
{
for Database in $(echo "SHOW DATABASES" | mysql -N)
do
echo "Dump DB: ${Database}"
FName="db-${Database}-$(date +%A).sql"
mysqldump -R ${Database} > "${FName}" && Compress "${FName}"
done
}
cd /backup/mysql-backup && DumpDB
- A hozzászóláshoz be kell jelentkezni
Ide is beszúrom amiről szó van:
http://pastebin.com/m7eff8b81
De ez csak részlete az egésznek! S ez is működő progi csak most éppen bővíteném ki egy plusz funkcióval.
- A hozzászóláshoz be kell jelentkezni
Hát, nekem megcsinálta crontabot, mit kellene még tennie?
- A hozzászóláshoz be kell jelentkezni
Áh, az gond, ha a te alapértelmezett shelled nem bash. A mintád elejéből hiányzik a #!/bin/bash, beleírtam.
- A hozzászóláshoz be kell jelentkezni
De bash, és nem hiányzik az elejéről. Mint említettem ez egy részlet a nagy egészből. Amúgy nálad az else ágat is megcsinálta? Mert az első ággal nincs gond.
- A hozzászóláshoz be kell jelentkezni
Szerintem meg.
fisher@zsebi:/tmp$ ./a.sh
Időzited a felvételt? (i/n) i
Ez sorozat lesz? (i/n) i
Példák:
Sorozat minden hétfőn 16.30-tól: 1 16 30
Sorozat minden hétköznap 17.30-tól: 1-5 17 30
Sorozat mindennap 18.30-tól: * 18 30
Add meg az adatokat szóközzel! (nap, óra, perc) 01 01 01
Az adatokat elmentettem: Tv sorozat - 2009-01 01:01
fisher@zsebi:/tmp$ crontab -l
# Tv sorozat - -01-01:01
01 01 * * 01 _sorozat_01_01-01_cron.sh
fisher@zsebi:/tmp$ ./a.sh
Időzited a felvételt? (i/n) n
Add meg az adatokat szóközzel! (HH NN ÓÓ PP): 01 01 01 01
Az adatokat elmentettem: Tv felvétel - 2009-01-01 01:01
fisher@zsebi:/tmp$ crontab -l
# Tv sorozat - -01-01:01
01 01 * * 01 _sorozat_01_01-01_cron.sh
# Tv felvétel - 2009-01-01 01:01
01 01 01 01 * _2009-01-01_01-01_cron.sh
- A hozzászóláshoz be kell jelentkezni
És mi van akkor ha NEM sorozat lesz, de időzíteni kell? Erre is a cront használom, mert az at átláthatatlan számomra.
Próbáld csak ki?
Amúgy megvan a hiba... rájöttem. Rossz helyen van az egyik fi.
- A hozzászóláshoz be kell jelentkezni
A fenti példában mindkét ágon végig mentem, mindkét bejegyzést megcsinálta a crontabba.
- A hozzászóláshoz be kell jelentkezni
[]
- A hozzászóláshoz be kell jelentkezni
> A sorszámozást k.rvagyorsan felejtsd el,
Inkább neked kéne elfelejteni ...
- A hozzászóláshoz be kell jelentkezni