Új hozzászólás Aktív témák
-
ALI_G
veterán
én itt keresgéltem a read-del kapcsban, de nem tudom hogy érted. Fájlból hogy olvassak be a read-del soronként?
A read-et csak úgy ismerem, hogy ENTER leütéséig olvassa a leütött karaktereket a Standard inputról. Ha átirányítom egy fájlba read > fájl, akkor beleírja. vagy vhogy így.
Te ezt hogy gondolod, mert én nemtom.
közben azért próbálkozom.
[Szerkesztve] -
ALI_G
veterán
igazad van, le is esett.
Viszont most olyan problémám van, hogy minden egyes alkalommal csak 1 sort olvas be a read:
#! /bin/bash
COUNT=0
while [ $COUNT -lt 2 ]
do
read sor < $1
echo $sor
COUNT=$(($COUNT+1))
done
azért 2-ig megy a count, mert kis fájlon tesztelem. Ha működni fog arra hogy kettessével irogassa Enterenként, akkor átírom 24-re. -
Jester01
veterán
Mert itt már a while-nak (illetve az azt futtató alshellnek) kell megadni az átirányítást.
while [ $COUNT -lt 2 ]
do
read sor
echo $sor
COUNT=$((COUNT+1))
done < $1
MOD: Illetve kezdők jobban szokták szeretni a cat $1 | while ... formát mert jobban átlátható. Viszont indít egy fölösleges cat processzt.
[Szerkesztve]Jester
-
Jester01
veterán
Ez így nem lesz jó, mert a belsõ ciklus mindig újrakezdi a fájl olvasását az elejérõl.
Szóval mindenképpen az a while read sor kell kívülre. Belül meg simán csak számolod a sorokat, és 24 után egy if segítségével vársz egy entert és nullázod a számlálót. Még lesz vele egy kis gubanc, mégpedig az, hogy az entert váró read is a már átirányított fájlból akar majd olvasni. Szóval azt meg vissza kell irányítani a terminálra Ehhez célszerû elmenteni a ciklus elõtt az stdin fájlleíróját, és a belsõ readnek megadni. Olvasd el a man bash átirányításról szóló részét, különös tekintettel a fájlleirók másolására.Jester
-
ALI_G
veterán
uh, kicsit sokáig voltam Pesten, tovább mint terveztem. Most jöttem, és van most is 1 kérdésem:
Ez mit jelent:?
IFS=$'\\\\n' -
ALI_G
veterán
nem mondom h teljesen értem, de innen szedtem: [link]
mod.: gáz van. Nemtok be SSH-zni suliba megnézni a bash manuálját, hogy lehet ezt megcsinálni: Ehhez célszerû elmenteni a ciklus elõtt az stdin fájlleíróját, és a belsõ readnek megadni.. Neten fent van magyarul?
most linuxot nincs kedvem letölteni (live), feltelepíteni meg végképp nem is tudnék hely hiányában.
[Szerkesztve] -
ngabor2
nagyúr
van egy ilyen kis szkriptem:
#!/bin/bash
rm -rf mp3dir
stdir=`pwd`
koz=''_''
mkdir mp3dir
mpdir=$stdir/mp3dir
k=0;
find . | grep \.mp3$ | sort > mp3list.txt
i=`wc -l mp3list.txt | cut -d'' '' -f1`
for j in `seq -w $i `
do
mpfile=`cat mp3list.txt | head -n $j | tail -n 1;`
mp=`basename ''$mpfile''`
cp ''$mpfile'' $mpdir/''$j$koz$mp''
done;
működik rendesen (mp3-albumokat sorszámoz, és 1 kt-ba pakolja. egyes mp3-lejátszóknál jól jön), csak nem túl elegáns, hogy mindig létrehoz egy mp3list.txt állományt. meg lehet-e oldani, hogy ne egy file-on keresztül kelljen sorbapakolni a file-okat, hanem pl. egy változóba, vagy valami hasonló, memóriában helyet foglaló cuccban? vagy ha úgy macerás, akkor egy tmp-file-ba (tehát szabályosan kezelje a /tmp könyvtárat, véletlenszerű névvel)? -
ngabor2
nagyúr
na ez az! köszi.
a szkript kb. 1 éve kezdődött, eddig 5 verziót élt meg, és közel 0 szkriptelési tudással kezdtem neki.
az eredeti ''probléma'' az is volt, hogy nem tudom, hány számjeggyel számozom a file-okat, de ez a legtöbb esetben 3. a seq -w is emiatt került bele, azelőtt egy 3-részes if-sorozat volt benne, de az annyira gányul nézett ki, hogy szörnyű
most is igaz, hogy a legegyszerűbb dologra nem gondoltam, pontosabban ezt a módszert nem ismertem. -
Jester01
veterán
-
ALI_G
veterán
Nos, van egy kezdeményezésem a megoldásra, amit most nem áll módomban letesztelni.
#! /bin/bash
if test -f $1;
then
_____HOSSZ=`wc -l $1`
_____for ((i=1; i!= $[$HOSSZ+1]; ++i))
_____do
_____head -n $i | tail -n1
_____if [ $i -ge 2 ]; then
__________read
__________clear
_____fi
_____done
else echo ''Nem fájl!''
_____exit
fi
ps.: hiába rakom kódba, a szóközt/tabulálást nem tartja meg, de miért
Kérdésem: hol fog ez megbukni? Csak mert amennyire ismerem magam tuti nem fog műxeni
Az a bash mélységeibe vájós dolog nekem lehet nem menne, és most nem is tudnám meg se nézni, mert bexart a suliban a server, vagy csak szarakodnak velünk (ált. ZH előtt csinálnak vele vmi gubancot, vagy kötprog leadások előtt, hogy a hallgatónak esélye se legyen befejezni időben lassan azt kell hinnem ezt direkt csinálják)
[Szerkesztve] -
Jester01
veterán
Nézd meg ngabor2 szkriptjét, a wc sajnos gonosz módon kiírja a fájl nevét is. Szóval a sorszámoláshoz kell a cut is.
A ciklusban nyilván nem jó a $i -ge 2 feltétel (még akkor sem ha az ott tkp 24 akart lenni), hiszen így az első képernyő után már soronként várná az entert.
A for ciklusba a $[$HOSSZ + 1] helyett simán $HOSSZ + 1 kell (vagy egyszerűen i <= $HOSSZ ugye). A head után hiányzik a fájlnév ($1).
MOD: a szóközt tartalmazó fájlok helyes kezeléséhez a megfelelő helyeken idézőjelbe kell tenni a $1-et.
[Szerkesztve]Jester
-
ALI_G
veterán
Van egy elméleti megoldásom. Félig vna csak shell-ben, mert nem volt időm buszon átnézni a szintaktikát (és gyorsan felejtek), de szerintem érthető lesz így is mit akartam.
Íme:
K=wc -l
x=1
for i=1 to K
do
if X<25
head -n i szoveg | tail -n 1 #ez tuti azt csinálja, h minden sort egyesével kiír.
x++
fi
read
X=1
rof
Tudom sok a szintaktikai hiba, de most csak az algoritmus helyessége a lényeg. Ha jó, akkor átírom amint lesz időm, csak holnap egy másik tárgyból ZH-zom. Ezt meg holnap estig kell leadjam.
[Szerkesztve] -
ALI_G
veterán
nah, átírtam shell scripté, kijavítottam pár apróságot:
K=wc -l $1
x=1
for ((i=1;i<=k;i++))
do
if $[ x -lt 25 ]
head -n i szoveg | tail -n 1 #ez tuti azt csinálja, h minden sort egyesével kiír.
x=x+1
fi
read
x=1
done -
Jester01
veterán
Ez sajnos még mindig nem jó
Amit a wc-vel kapcsolatban írtam, azt nem vetted figyelembe.
A sor kiírás az if elé kell, hiszen azt mindig meg kell csinálni.
A head-bõl kimaradt a $ jel az i elõl, illetve a szoveg helyett $1 kell.
Az if-ben rossz helyen van a $ jel, helyesen if [ $x -lt 25 ] és kimaradt a then.
Az x=x+1 helyesen x=$((x+1))
A read elõtti fi az gondolom inkább egy else, és a fi a done elé való.
k=`wc -l ''$1'' | cut -d\ -f1`
x=1
for ((i=1;i<=k;i++))
do
head -n $i ''$1'' | tail -n 1 #ez tuti azt csinálja, h minden sort egyesével kiír.
if [ $x -lt 25 ]
then
x=$((x+1))
else
read
x=1
fi
doneJester
-
ALI_G
veterán
a delimiter határolójelet jelent. Mostmár ezt is tudom. De legalább a hibás sort számát kiírhatná a linux shellje.
ps:
head -n $i ''$1'' | tail -n 1
ebben a ' ' az miért két karakter és miért nem egy: '' Igaz ugyanúgy néznek ki, de nem mind1 melyiket mikor használjuk. Ez itt jó?
ps2: már látom. valszeg ez lesz a hiba. A PH motorja az idézőjelet két karakterér bontja, vagy az XP vágólapja rosz. Kipróbálom sima idézőjellel, bár nem tudom ide miért is kell.
ps3: ja, mert a fájlban szóközök is lehetnek.
[Szerkesztve] -
ALI_G
veterán
bocs, de megint lejárt a módosítási időlimit.
Ugyanazt a hibát kaptam.
cut: invalid delimiter -
ALI_G
veterán
tényleg, mivel a sok szóközből 1et csinál mindig. De amúgy a code mód miért nem működik, régen ment vele rendesen a kód. nem vágta ki a tab-okat.
Amúgy oda miért kell 2 szóköz?
Amúgy a cut:...nál a cut-ra nem úgy néztem mintha a ódban lenne, hanem aztem a hibamagyarázás része. és mivel még linux buherátor sem vagyok, ezért aztem ilyen szűkszavú a linux, mint mindig is volt.
téháX
most try-olom.
ps: trájoltam, de ez az eredmény copy-ja:
rozi> chmod +x proba.sh
rozi> ./proba.sh bazlaat.sh
rozi>
visszakaptam a shell promtját vagy mit. Nem generált semmilyen látható kimenet.
[Szerkesztve] -
ALI_G
veterán
uf, ezen kívül van még 1 probléma:
átírtam a k értékét 66-ra, hogy lássam műxik e maga az algoritmus. Íme az eredmény egy részlete (ugyanis végtelen lett vhogy a ciklus):
rozi> ./ali_g.sh bazlaat.sh
66
usage: tail [+/-[n][lbc][f]] [file]
tail [+/-[n][l][r|f]] [file]
usage: tail [+/-[n][lbc][f]] [file]
tail [+/-[n][l][r|f]] [file]
usage: tail [+/-[n][lbc][f]] [file]
tail [+/-[n][l][r|f]] [file]
.......CTRL+C-ig csinálta, ment volna világgá -
ALI_G
veterán
uh hogy a fene enné meg és a fene fenét enne....
Nekem nincs jobb 5letem. Amit még 2 v 3 napja írtál a sima read-es, az meg nehéznek néz ki. Nem hiszem h van arra időm h kihámozzam, de ha nem találok semmit, akkor nekifogok úgy. Bár egyedül kétlem h menne.
Egy kívánságom van: tudjak eccer linuxul. -
Jester01
veterán
Kérlek szépen a sima read-es változat az ennyi:
i=0
exec 3<&0
cat ''$1'' | while read line
do
echo ''$line''
if [ $((i++)) -eq 24 ]
then
read <&3
i=0
fi
done
A trükk amit említettem az exec-es sor. A fájlleíróknak linuxban számuk van. A 0,1,2 rendre az stdin, stdout és stderr. A többit arra használod amire akarod. A 3<&0 átirányítás azt jelenti, hogy a 0-ás bemeneti fájlleírót (ami ezek alapján akkor az stdin) duplikálja 3-as számúként.
A while ciklus a pipe miatt alshellben fog futni, aminek az stdin-je a cat stdout-jára van kötve ezért ''elveszik'' a szülõ shell stdin-je (a terminál). Viszont a 3-as számmal ez továbbra is elérhetõ. Vagyis a belsõ read-nek megmondjuk, hogy innen olvasson. (az az átirányítás technikailag azt jelenti, hogy a 3-ast ismét visszaduplikálja a 0-ásra, mivel a read onnan fog olvasni.)
Bonyolultan hangzik, de egyszerû. Remélem érthetõ voltamJester
-
ALI_G
veterán
re, h úgy mondjam.
El lett fogadva a scriptem. Viszont most újra kell scriptet írjak. Ezt most saját használatra.
A lényeg, hogy ki kell keressek egy mappát. A névben szerepelnie kell a kroc szónak.
Eddig ezem van:
#! /bin/bash
for a in $1/kroc*
do
echo $a
done
Ez sajna nem megy bele az almappákba rekurzívan. Ezt hogy tudom beletenni?
[Szerkesztve] -
ALI_G
veterán
igen, elég a parancs is.
ki is próbálom
ps:
eredmény:
rozi> find . -type d -name '*kroc*'
find: cannot read dir ./aset: Permission denied
find: cannot read dir ./local/etc/amanda: Permission denied
find: cannot read dir ./local/var/openldap-ldbm: Permission denied
find: cannot read dir ./local/var/openldap-slurp: Permission denied
find: cannot read dir ./local/var/amanda: Permission denied
rozi>
ez azt jelenti, hogy nem talált ott ahol próbálta? az az 5 pedig védett és nem mehetett bele?
[Szerkesztve]
Új hozzászólás Aktív témák
- XPEnology
- Politika
- ASUS ROG Ally
- TCL LCD és LED TV-k
- Júniusban végre bemutatkozhat az új Gears of War játék
- Motorola Moto G24 Power - hol van az erő?
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- A fociról könnyedén, egy baráti társaságban
- Melyik tápegységet vegyem?
- Posta, csomagküldés
- További aktív témák...
- Eredeti Microsoft termékek - MEGA Akciók! Windows, Office Pro Plus, Project Pro, Visio Pro stb.
- Windows 10/11 Home/Pro , Office OEM/Retail kulcsok
- AKCIÓ! - STEAM kulcsok /Anuchard, Aragami, Children of Morta, stb. - 2024.04.17.
- Játékkulcsok olcsón: Steam, Uplay, GoG, Origin, Xbox, PS stb.
- Windows 10 11 Pro Office 19 21 Pro Plus Retail kulcs 1 PC Mac AKCIÓ! LEGOLCSÓBB! Automatikus 0-24