Kedves Fórumtársak!
A következőről lenne szó:
Adott egy shell szkript. Azt lehet tudni, hogy a 10 és afeletti argumentumokat a ${szám} formában lehet elérni.
Én ezeket szeretném egy cikluson belül egy futóindex-szel egyenként elérni, és manipulálgatni. Azoban itt jön a trükkös része a dolognak. Hogyan is kellene ezt?
Az alábbi a kód:
#!/bin/bash
for i in `seq 1 $#`; do
echo -e ${$i}
done
A probléma abban rejlik, hogy a kapcsos zárójelen belül gondja van a bash-nek a $-ral. Ha a kifejezés elé teszem, akkor pedig $$ lesz, ami a szkript pidje. Ha escape-elem az első $-t, akkor sem működik rendesen, úgyhogy kicsit talácstalan vagyok. Ezért fordulok hozzátok. Hogyan kellene ezt?
for i in "$@"-et nem akarok, mert az megkeveri a paramétereket, ha valamelyikben szóköz van.
Előre is köszönöm a válaszokat.
Üdv:
János
- 1904 megtekintés
Hozzászólások
Nem értem a kérdést. Mit jelent az, hogy a "$@" megkeveri a paramétereket? Az alábbi nem lenne jó?
#!/bin/bash
for i in "$@"; do
echo "$i"
done
$ ./test.sh 1 '2 3' 4
1
2 3
4
- A hozzászóláshoz be kell jelentkezni
Valóban. Nálad a pont, nem rontja el.
Ellenben nekem arra kellene, hogy a seq-nél található 1-est 3-ra módosíva csak a 3-dik és amögötti argumentumokkal foglalkozzon.
Viszont nem akarnék beletenni egy if-et, csak ezért. Ezért nem szívlelem a $@-es megoldást.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Nem tudom most lepróbálni de ha kapcsos helyett sima zárójelet írsz az nem jó? $($i)
- A hozzászóláshoz be kell jelentkezni
sajnos ez sem jó.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
konkretan 3. es amogotti argumentummal szeretnel dolgozni, akkor:
#v1:
for ((i=3;i<=$#;i++)); do
echo ${!i};
done
#v2:
shift 2
for i; do
echo $i;
done
v2 gyorsabb ebben az egyszeru esetben
- A hozzászóláshoz be kell jelentkezni
Hint: shift n.
- A hozzászóláshoz be kell jelentkezni
for i in "$@"; do ...
helyett egyszerűen ez is elég:
for i; do ...
- A hozzászóláshoz be kell jelentkezni
> Ha escape-elem az első $-t, akkor sem működik rendesen
igy: \${$i} ?
- A hozzászóláshoz be kell jelentkezni
igen, ez nem működik többek közt
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
echo -e ${!i}
A felkiáltójel csinál indirekciót: az i-ben lévő változó értékét még egyszer mint változónevet értelmezi és újra kiértékeli.
> a=b
> b=c
> echo ${!a}
c
- A hozzászóláshoz be kell jelentkezni
köszi a segítségedet. a tiéd a legtetszetősebb megoldás.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Ilyenkor össze kell állítani egy változóban magát a parancssort úgy, hogy ne zavarodjon meg tőle a bash, aztán eval segítségével végrehajtani:
#!/bin/bash
for i in `seq 1 $#`
do
parancs='echo -e ${'$i'}'
eval $parancs
done
- A hozzászóláshoz be kell jelentkezni
köszi a segítséget.
a te megoldásod egmonténál kicsit körülményesebb, de legalább működik.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Hát akkor hagyjuk a körülményeket! :)
for i in `seq 1 $#`; do eval echo \${$i}; done
Azaz: az eval kiértékeli $i-t és leszedi \-t, végül lefuttatja echo ${aktualis ertek}-et.
- A hozzászóláshoz be kell jelentkezni
Újabb kérdésem támadt:
Ez miért nem működik?
echo "janos:12512:1000" | IFS=':' read a b c && echo a $a $b $c
Pusztán azért nem, mert a read egy beépített bash parancs, vagy valami másért?
A cucc tökéletesen megy, ha egy fájlt irányítok bele kacsacsőrrel, de ha |-al küldenöm neki a sorokat, akkor azt valamiért nem komálja.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Nekem működik:
/Users/kreszi % echo "janos:12512:1000" | IFS=':' read a b c && echo a $a $b $c
a janos 12512 1000
Vagy valami másnak kellene történnie?
KisKresz
- A hozzászóláshoz be kell jelentkezni
Hm. Ez érdekes.
Pont ez lenne a kívánt állapot, ellenben nekem csak az a-t írja ki. :S
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
IFS=':' read a b c < <(echo "janos:12512:1000") && echo a $a $b $c
man bash -> process substitution
A "read" nem állhat pipe jobb oldalán, mert akkor számára technikailag külön subshellt indít a bash, amelyik beolvassa az értéket, majd rögtön ki is lép (tehát elfelejti), nekünk az kell, hogy ez a shell futtassa a read-et.
- A hozzászóláshoz be kell jelentkezni
Én meg ZSH-t használok, talán ezért működött.
KisKresz
- A hozzászóláshoz be kell jelentkezni
kezdem utálni a bash-t.
promtból működik, de szkriptben nem tetszik neki:
../Desktop/reown.sh: line 34: syntax error near unexpected token `<'
../Desktop/reown.sh: line 34: ` IFS=':' read scratch UFROM UTO < <(echo "janos:12512:1000")'
A szkript maga itt.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Javítottam :-) Az "itt_a_dokument" átirányításnál "< <(echo..." volt a helyes "<< (echo..." helyett, azaz a két kacsacsőr közé bekerült egy szóköz.
- A hozzászóláshoz be kell jelentkezni
sajna nekem még így szóköz nélkül sem megy :S
../Desktop/reown.sh: line 34: syntax error near unexpected token `('
../Desktop/reown.sh: line 34: ` IFS=':' read scratch UFROM UTO << (echo "$i")'
Most épp ezt bújom, hátha segít.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Tipp: #!/bin/bash
- A hozzászóláshoz be kell jelentkezni
igen, úgy írtam meg a szkriptet.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Ahogy Egmont is rámutatott, az a probléma, hogy a read nem a saját bemenetéről olvas, hanem az őt futtató programéról. Mivel a függvény önálló héjban fut, adódik a következő körülményes (:-)) megoldás:
#!/bin/bash
olvas()
{
IFS=':'
read a b c
echo $a $b $c
}
echo 'janos:12512:1000' | olvas
- A hozzászóláshoz be kell jelentkezni
köszönöm a válaszokat. ma is okosabb lettem kicsit.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
érdekesen működnek itt a dolgok, de sikerült kierőszakolnom valami működőképeset:
#!/bin/bash
A=5 B=4 C=3 cat <<%%
-------------------------------------
(echo $1)
$A
$B $C
(echo This is line 2% of the message.)
This is the last line of the message.
-------------------------------------
%%
IFS=':' I=janos:12512:1000 read scratch UFROM UTO <<%%
$I
%%
echo $scratch $UFROM $UTO
Érdekes módon a változókat amiket használok a here-documentekben, azokat a paracs kedző sorában kell elhelyezni, különben a változók nem lesznek elérhetők.
Szerk: A kész szkript itt érhető el.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Harmadik kérdés:
Ez a parancs miért nem változtatja meg a jelenlegi könyvtárszint alatt található symlinkek uid-jét?
[code]
find . -uid 12512 -exec chown 1000 '{}' \;
[code]
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
The chown utility changes the user ID and/or the group ID of the specified files. Symbolic links named by arguments are silently left unchanged unless -h is used.
KisKresz
- A hozzászóláshoz be kell jelentkezni
köszi az infót.
csak furcsállom, mert mikor
chown usernév . -R
-rel eredetileg lecseréltem a fájlok tulaját, akkor megváltozott a symlinkek tulaja is...
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni