[Megoldva] bash subrutin

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

Hozzászólások

WORKSFORME:

#!/bin/bash

function foo {
echo "Footest"
}

foo
echo "14 sor"
echo "15 sor"

foo
echo "14 sor"
echo "15 sor"

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).

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.

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 

> 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.

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.

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

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