Hozzászólások
[quote:f8cfdab219="Anonymous"][quote:f8cfdab219="szaszg"]Kedves Zahy!
En nem azt mondtam, hogy a seq mindenhol letezik/standard unix util, csak azt, hogy nem Linux specifikus, mivel a GNU coreutils resze... Az, hogy a linux disztribek mind atveszik, es mondjuk a HP/Solaris/IBM nem, az nem tartozik a keredes lenyegehez...
Zsiraf
U.i.: [code:1:f8cfdab219]echo hi | (read a; echo $a)[/code:1:f8cfdab219] Az, hogy a pipe-nal letrejon-e egy uj processz az hmm... hat anelkul, hogy futna egyszerre az echo hi es a read a ??? varom az otleteket....
Hm:
int i[2]; pipe(&i[0]);
és most jön a trükk: pthread_create() :-)
A viccet félretéve a lényeg: a fenti csövet meg lehet csinálni úgy, hogy csak a cső bal oldalához hozunk létre egy új processzt, a jobb oldalán maga az eredeti shell fut, ekkor kapod a szokott eredményt, azaz, hogy visszakapod a értékét. És persze meg lehet csinálni úgy is, hogy a jobb oldalán hozunk létre új processzt (vagy pláne mind a két oldalon!), ekkor kapod a fenti eredményt, hisz a cső jobb oldalán levő processz hiába olvas be egy a változóba, azt a változót csak ő maga fogja látni. Arra, hogy a fent-meg-nem-nevezett shellben ezt hogy csinálták meg, már nem emlékszem.
Remélem, így már érthetőbb a fenti kissé elnagyolt utalásom a megvalósításokról.
Zahy
Nalatod, szoval uj processz KELL! A kerdes csak az, hogy a pipe bal oldala, vagy a jobb oldala lesz-e az uj processz. Ez meg "filozofia" kerdese... Mert lehet, hogy a fent emlitett kodreszletnel a jobb oldalas a "jobb", de mas esetben meg a bal oldali a "jobb"...
[quote:f8cfdab219="Zahy"]
Ui: most hirtelen feltűnt, hogy itt van egy fölösleges zárójelpár. Nem nézem vissza, de szerintem én a read és echo köré nem írtam zárójelet, és pont ez a lényeg, hogy ha nincs zárójel, akkor hogyan működik! Legalábbis a man-ban, amiből vettem, nincs zárójel!
Milyen szemfules vagy :-) Ugyanis a zarojel parral lehet "jo" mukodesre birni a programreszletedet... Persze van mas modszer is: [code:1:f8cfdab219]a=`echo hi`[/code:1:f8cfdab219] hihihihi....
[quote:f8cfdab219="Zahy"]Ui2: és az, hogy valami a gnu-coreutils része, az gyakorlatban sajnos/nem-sajnos csak annyit jelent, hogy a Linux disztrók része, meg a majdan eccer megjelenő Hurd-é, máshol nem az a standard! (Ez kissé olyan, mintha mindig mindenki a GNU-specifikus dolgokat várná el egy C-fordítótól.)
Csak sajnalni tudom a tobbit... Hiaba a normalis dolgok terjedesi sebessege mindig toredeke a nyomorult dolgoknak (pl. x386, AT bill scankodok/PnP/...)
Zsiraf
U.i.: Egyebkent, a GNU ennek ellenere NEM LINUX SPECIFIKUS!!!!
- A hozzászóláshoz be kell jelentkezni
Hali
Hogy tudnám rávenni a unixot, hogy nagyon nagy számokkal is dolgozzon. PL: 999999999999999999999999999999999999999999999999999999999999999999999999 + 1= ?
Köszi
- A hozzászóláshoz be kell jelentkezni
[quote:a6672cd172="sfec"]Hali
Hogy tudnám rávenni a unixot, hogy nagyon nagy számokkal is dolgozzon. PL: 999999999999999999999999999999999999999999999999999999999999999999999999 + 1= ?
Köszi
echo 'scale=20; 99999999999 + 1' | bc
- A hozzászóláshoz be kell jelentkezni
[quote:116c314aee="maszili"]
Használj idézőjeleket...
[code:1:116c314aee]
while read valtozo
echo "$valtozo"
done < egy_file
[/code:1:116c314aee]
Így sem jó. :( Még mindig levágja a sorvégi szóközöket.
- A hozzászóláshoz be kell jelentkezni
[quote:0748f8a4da="szaszg"]Hat igen, a tr az bash parancs? ezen kivul a [ szinten kulso parancs, sot meg a sed is! (no jo, a seq is...
A [ nem nyert, az beépített bash parancs.
- A hozzászóláshoz be kell jelentkezni
[quote:67be4649eb="szucs_t"]Így sem jó. :( Még mindig levágja a sorvégi szóközöket.
Szerintem a kiírással van a gond mert a read addig olvas amig
újsor karaktert nem talál... hacsak nem adtál meg mást -d paraméterrel. Tehát a sor tartalmazza a helyközöket is.
Esetleg lehet probléma a programszerkezettel is és akkor ott veszlenek el a helyközök.
[code:1:67be4649eb]
cat egy_file | while read valtozo; do
echo "$valtozo"
done
[/code:1:67be4649eb]
- A hozzászóláshoz be kell jelentkezni
[quote:6aa6ad1e9d="borso"][quote:6aa6ad1e9d="sfec"]Hali
Hogy tudnám rávenni a unixot, hogy nagyon nagy számokkal is dolgozzon. PL: 999999999999999999999999999999999999999999999999999999999999999999999999 + 1= ?
Köszi
echo 'scale=20; 99999999999 + 1' | bc
[code:1:6aa6ad1e9d]echo '999999999999999999999999999999999999999999999999999999999999999999999999 + 1' | bc [/code:1:6aa6ad1e9d] is megteszi, a scale akkor kell, ha nem egesz szamokkal akarsz dolgozni (pl osztas, egyeb), ha meg a negy alapmuveletnel tobbe is akarsz, akkor [code:1:6aa6ad1e9d]echo 'scale=200; 999999999999999999999999999999999999999999999999999999999999999999999999999 / s(1.2345)' | bc -l[/code:1:6aa6ad1e9d]
Zsiraf
amugy[code:1:6aa6ad1e9d]man bc[/code:1:6aa6ad1e9d]
- A hozzászóláshoz be kell jelentkezni
[quote:9222420310="maszili"]
Szerintem a kiírással van a gond mert a read addig olvas amig
újsor karaktert nem talál... hacsak nem adtál meg mást -d paraméterrel. Tehát a sor tartalmazza a helyközöket is.
Esetleg lehet probléma a programszerkezettel is és akkor ott veszlenek el a helyközök.
[code:1:9222420310]
cat egy_file | while read valtozo; do
echo "$valtozo"
done
[/code:1:9222420310]
Erre a formára is átírtam, de továbbra sem jó. :(
Így néz ki a szkriptem:
[code:1:9222420310]
#!/bin/bash
cat /1/file.txt | while read valtozo
do
echo "$valtozo".
done
[/code:1:9222420310]
Hol lehet a baj?
- A hozzászóláshoz be kell jelentkezni
[quote:b2cc42e041="miq"]
Azert, mert a targy shell programozasrol szol, es a bc parancsot hasznalva nem sokat mutatsz abbol, hogy esetleg le tudsz-e kodolni egy ciklust, ha kell...
Egyebkent, kicsit atgondolva, van meg rovidebb megoldas.
[code:1:b2cc42e041]
((L=${#1}>${#2}?${#1}:${#2}))
set - $(printf "%${L}s" "$1"| tr " " 0) $(printf "%${L}s" "$2"| tr " " 0)
M=0
while ((L--)); do
S=$[${1:L:1}+${2:L:1}+M]
C="$[S%10]$C"
M=$[S/10]
done
echo $M$C|sed "s/^0//"
[/code:1:b2cc42e041]
Tenyleg, nem csinalunk egy ki irja meg rovidebben versenyt? :)
Ebbe a versenybe késő lévén nem megyek bele, de kedves miq és Zsiráf. Ha megengedtek pár apró megjegyzést:
1) a
$[ ]
konstrukció erőteljesen bash-specifikus ficsor (POSIX-shell-ben sincs, nemhogy "a shell"-ben)
2) a seq ezzel szemben baromira linuxos ficsor, az egyéb UNIX(-like) rendszerek jó részében nincs. De ha ezzel nem is ért mindenki egyet, itt egy apróság: míg egy while ciklussal ilyen gond soha nincs, addig a fentebb vázolt
for i in `seq`
forma extrém esetekben adhatja az arg list too long hibaüzenetet, ha jól csalódom.
Zahy
- A hozzászóláshoz be kell jelentkezni
[quote:238296ae5e="Anonymous"]itt egy apróság: míg egy while ciklussal ilyen gond soha nincs, addig a fentebb vázolt
for i in `seq`
forma extrém esetekben adhatja az arg list too long hibaüzenetet, ha jól csalódom.
Szerintem rosszul csalódsz. Kernel szinten van egy határ az argumentum lista hosszára, ennek túllépésekor kapod a fenti üzenetet. De a for nem külső progi, nem történik exec hívás, a shell saját magán belül elintézi, és szerintem jóval nagyobb a tűréshatára.
- A hozzászóláshoz be kell jelentkezni
[code:1:609fc69c98]
read alma
echo "$alma"...
[/code:1:609fc69c98]
Ha beütöm a szpészt, majd leenterezem, egyszerűen nem írja ki azt a szóköz karaktert. Sem a szóköz-a-t (" a"), sem az a-szóköz-t ("a "). Mi lehet?
- A hozzászóláshoz be kell jelentkezni
[quote:700d6e4c8c="szucs_t"]Sziasztok! Egy vélhetően egyszerű kérdésem van, de én csak szenvedek.
Hogyan lehet bash szkriptben egy sztring részét (mondjuk az első négy karakterét) egy változóba tenni, illetve egy sztring egy adott elemére (karakterére) hivatkozni?
Itten van leírva: http://tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html#sect_10_03, a 10.3.3.2 fejezetben.
Egyébként a Magyar LDP tervezi a doksi fordítását. Ha valaki szeretne segíteni benne, akkor nálam jelentkezhet (dacas[kukac]fsf[pont]hu). A doksi XML formátumú, részekre (fájlokra) van bontva, tehát könnyen megosztható a munka. üdv. dacas
- A hozzászóláshoz be kell jelentkezni
[quote:47e48a5da8="szaszg"]Nalatod, szoval uj processz KELL!
Egyáltalán nem KELL új processz. Vszleg így a legegyszerűbb leprogramozni, de így nem elég kényelmes a fent felvázoltak miatt a felhasználó számára.
Komplett perl progik képesek ezerszer többet megcsinálni egy shell-nél, egy processzben. De egy processzben akár egy usermode linux vagy vmware (komplett linux- illetve hardver-emulátor) is elfér. Tehát a shellnél is csak ügyes programozás kérdése, hogy a fent felvázolt pipe-ot le bírják-e programozni egy processzben. Egyáltalán nem lehetetlen.
- A hozzászóláshoz be kell jelentkezni
Sziasztok
hogyan lehetne egy if feltétlbe or -t ill and -et csempészni?
valami ilyesmi kéne
if [ -z $str1 || -z $str2 ] ; then blabla
kosz
- A hozzászóláshoz be kell jelentkezni
[quote:98e97cbc3e="szucs_t"][code:1:98e97cbc3e]
read alma
echo "$alma"...
[/code:1:98e97cbc3e]
Ha beütöm a szpészt, majd leenterezem, egyszerűen nem írja ki azt a szóköz karaktert. Sem a szóköz-a-t (" a"), sem az a-szóköz-t ("a "). Mi lehet?
Hát ez tényleg érdekes!
Ugyanis amit írtál, az tényleg áll:
[code:1:98e97cbc3e]
fules@chaos:/tmp$ while read alma; do echo "--$alma--"; done <teszt
--vannak--
--space-ek--
--a--
--sorok--
--vegen--
----
[/code:1:98e97cbc3e]
Viszont ha nem adok a read-nek változónevet, akkor korrekt:
[code:1:98e97cbc3e]
fules@chaos:/tmp$ while read; do echo "--$REPLY--"; done <teszt
--vannak --
--space-ek --
--a --
--sorok --
--vegen --
----
[/code:1:98e97cbc3e]
Aha, megvan. Ha a read-nek változókat is adsz meg, akkor a _szavakat_ pakolja azokba (a maradékot a legutolsóba), tehát szavakra bont, és valószínűleg itt tűnnek el a záró szóközök.
Ha viszont nem adsz meg változót, akkor az egész _sort_ pakolja a $REPLY-ba, szavakra bontás nélkül. Legalábbis a bash manpage-e szerint :).
- A hozzászóláshoz be kell jelentkezni
Hogyan tudnán megoldani bc és dc parancsok nélkül?
- A hozzászóláshoz be kell jelentkezni
Hi!
Ha nem olyan fontos, hogy shell script legyen, akkor pl perl :)
TBS::Antiemes
- A hozzászóláshoz be kell jelentkezni
[quote:07e8df94e4="dacas"]
Itten van leírva: http://tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html#sect_10_03, a 10.3.3.2 fejezetben.
Egyébként a Magyar LDP tervezi a doksi fordítását. Ha valaki szeretne segíteni benne, akkor nálam jelentkezhet (dacas[kukac]fsf[pont]hu). A doksi XML formátumú, részekre (fájlokra) van bontva, tehát könnyen megosztható a munka. üdv. dacas
Köszi, már mutatták. Most a változókban a szóköz karakterekkel szenvedek.
Én nem tudok segíteni, de sok sikert kívánok a fordításhoz!
- A hozzászóláshoz be kell jelentkezni
[quote:73899c5578="gsimon"]
Aha, megvan. Ha a read-nek változókat is adsz meg, akkor a _szavakat_ pakolja azokba (a maradékot a legutolsóba), tehát szavakra bont, és valószínűleg itt tűnnek el a záró szóközök.
Ha viszont nem adsz meg változót, akkor az egész _sort_ pakolja a $REPLY-ba, szavakra bontás nélkül. Legalábbis a bash manpage-e szerint :).
Köszi, így működik! Bár még nem tudom, ha a cikluson belül is használok másik ciklust, mi lesz a $REPLY változómmal... :?
- A hozzászóláshoz be kell jelentkezni
Próbáld ki így:
or: if [ -z $str1 -o -z $str2 ] ; then
and: if [ -z $str1 -a -z $str2 ] ; then
vagy így:
if [ -z $str1 ] || [ -z $str2 ] ; then
if [ -z $str1 ] && [ -z $str2 ] ; then
- A hozzászóláshoz be kell jelentkezni
[quote:413070b01b="szucs_t"]Köszi, így működik! Bár még nem tudom, ha a cikluson belül is használok másik ciklust, mi lesz a $REPLY változómmal... :?
Mi lenne :) ?
[code:1:413070b01b]
fules@chaos:/tmp$ while read; do alma=$REPLY; echo "--$alma--"; done <teszt
--vannak --
--space-ek --
--a --
--sorok --
--vegen --
----
[/code:1:413070b01b]
- A hozzászóláshoz be kell jelentkezni
http://www.shelldorado.com/freenode/BashFaq.html#faq1
- A hozzászóláshoz be kell jelentkezni
muxik kosz
- A hozzászóláshoz be kell jelentkezni
[quote:3aef66167b="gsimon"]
Mi lenne :) ?
[code:1:3aef66167b]
fules@chaos:/tmp$ while read; do alma=$REPLY; echo "--$alma--"; done <teszt
--vannak --
--space-ek --
--a --
--sorok --
--vegen --
----
[/code:1:3aef66167b]
Jé, így meg működik!
Ez érdekes... Bár logikus.
Köszi!
- A hozzászóláshoz be kell jelentkezni
[quote:71c703ab52="vmiklos"]http://www.shelldorado.com/freenode/BashFaq.html#faq1
Köszi, ezt sem láttam még. Szépen elmentem. Jónak tűnik.
- A hozzászóláshoz be kell jelentkezni
[quote:59f3c0c7ca="sfec"]Hogyan tudnán megoldani bc és dc parancsok nélkül?
Miert akarod bc nelkul???? :oops: :oops:
Zsiraf
U.i.: beszelni nem akarsz pl. a nyelved nelkul??? 8O
- A hozzászóláshoz be kell jelentkezni
Mert egy vizsga beadandó és enélkül kérik. :cry: :evil:
- A hozzászóláshoz be kell jelentkezni
szevasztok!
mondja meg légyszíves vki, hogy a következő kódrészletből
`date '+%d-%B-%Y'`
a cron miért csak ezt látja
`date '+
igy néz ki a teljes kód:
tar -zcvpf /var/backups/etc/etc-`date '+%d-%B-%Y'`.tar.gz /etc
shellből futtatom jó, de a cron nem eszi meg, miért?
thx
- A hozzászóláshoz be kell jelentkezni
[quote:77239ebf67="sfec"]Mert egy vizsga beadandó és enélkül kérik. :cry: :evil:
nekem ez még ment: [code:1:77239ebf67]echo $((999999999999999999+1))[/code:1:77239ebf67]biztos, hogy neked ennél nagyobb szám is kell?
- A hozzászóláshoz be kell jelentkezni
[quote:d54d9463e6="Anonymous"]A [ nem nyert, az beépített bash parancs.
man [
man bash (reserved words):
[code:1:d54d9463e6]! case do done elif else esac fi for function if in select then until while { } time [[ ]][/code:1:d54d9463e6]
- A hozzászóláshoz be kell jelentkezni
tedd be egy valozoba.
[code:1:f0ec06aa21]valtozo=`date '+%d-%B-%Y'`
tar -zcvpf /var/backups/etc/etc-$valtozo.tar.gz /etc
[/code:1:f0ec06aa21]
- A hozzászóláshoz be kell jelentkezni
PL:
932432249388811581756242166162094473321823077880462302929914840
787236851089881247634078375955325091148917989864616694612742496
363146065395929639389441778347863342539233326894482675570247609
151485669019561141764226591356363656403961341378290914935480636
230031181334212984107254890619080634893164649412966683730246454
258262718623837910833922385737792950830586096236659449266063814
748634480847819609873083137176086518458215728155843114703028813
808073672716717350803114949113849756242053159832657307402365510
524135380026732108992055829783231167513732403629377982305648602
14756291738952498308639060796694
+ 168574647234102058553294409219137509441292456802207774706150
276267625859987673552829431554256108342413026825741875483701
220456412178939491324936981334235285239739024137078670983223
216087092775149571937652556125979893425584203799277254451451
565537129982540416556788330941473928352319973441789897162805
004263712091209113916577602098758469476596495195294744113764
317232879719473445196681420624249431758741569161968905205768
793350993850140926318549304858167172215673404822907423605067
068362220733843869534915262113810337995350683489937400402888
564348100
EZ A MAX AMI KELL DC ÉS BC NÉLKÜL
- A hozzászóláshoz be kell jelentkezni
ez a -es cucc inkabb workaround kategoria, az IFS meg a megoldas :wink:
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Nekem is hasonló a problémám. Az egyik UNIX beadandó feladatom az, hogy írjunk scrpitet, mely összead két egész számot. Na én meg is írtam, de sajnos működnie kell hatalmas nagy számokra is, viszont, ha paraméterként ilyen nagy számokat adok meg, akkor helytelen eredményt ad. A bc és dc nem használható.
A két számot az alábbi paraméterrel adtam össze:
let osszeg=$1+$2
- A hozzászóláshoz be kell jelentkezni
Hi!
Ha lehet sed-et es/vagy awk-t hasznalni, akkor szerintem irj egy fuggvenyt, ami megcsinalja neked az osszeadast. Tulajdonkeppen nem annyira nehez. Inkabb lassu. De nagyon.
TBS::Antiemes
- A hozzászóláshoz be kell jelentkezni
[quote:54b3019bbc="FoREE"]tedd be egy valozoba.
[code:1:54b3019bbc]valtozo=`date '+%d-%B-%Y'`
tar -zcvpf /var/backups/etc/etc-$valtozo.tar.gz /etc
[/code:1:54b3019bbc]
igy is mukodik, de csak ha shell scriptbol inditom,
ha crontabba beteszem igy
01 08 * * * valtozo=`date '+%d-%B-%Y'` tar -zcvpf /var/backups/etc/etc-$valtozo.tar.gz /etc
akkor is ua. a jelenseg
- A hozzászóláshoz be kell jelentkezni
[quote:96bd94aeb2="Roky"][quote:96bd94aeb2="FoREE"]tedd be egy valozoba.
[code:1:96bd94aeb2]valtozo=`date '+%d-%B-%Y'`
tar -zcvpf /var/backups/etc/etc-$valtozo.tar.gz /etc
[/code:1:96bd94aeb2]
igy is mukodik, de csak ha shell scriptbol inditom,
ha crontabba beteszem igy
01 08 * * * valtozo=`date '+%d-%B-%Y'` tar -zcvpf /var/backups/etc/etc-$valtozo.tar.gz /etc
akkor is ua. a jelenseg
cat akarmi.sh
valtozo=`date '+%d-%B-%Y'`
tar -zcvpf /var/backups/etc/etc-$valtozo.tar.gz /etc
01 08 * * * /akarhol/akarmi.sh >/akarhol/log 2>&1
- A hozzászóláshoz be kell jelentkezni
[quote:af11758457="Anonymous"]
man [
[code:1:af11758457]vmiklos@vmhome:~# man [
No manual entry for [
[/code:1:af11758457]
vagy ez csak nálam van így? :wink:
- A hozzászóláshoz be kell jelentkezni
arra gondoltam amit drastik is irt...
tehat egy scriptbe fogd ossze a ket sort es kesz.
- A hozzászóláshoz be kell jelentkezni
Valaki akinek van kedve erre a pl. írni vmi megoldást?
THX!
Írjon Unix scriptet, ami a paraméterként kapott két tetszőleges hosszúságú (amit a Unix megenged), előjel nélküli numerikus egész stringet összeszorozza, és az eredményt a standard outputra írja.
Ha a szorzás sikerült akkor 0, egyébként (paraméterhiba esetén) 1 legyen a parancs státusz kimenete. Utóbbi esetben a megfelelő hibaüzenet a standard error-ra kerüljön.
A kiindulási adatok tartalmazhatnak értéktelen vezető nullákat, az eredmény nem.
A script nem használhatja a bc és dc parancsokat! (A megoldás a "bc" vagy "dc" stringet sem tartalmazhatja!)
- A hozzászóláshoz be kell jelentkezni
scriptbe scriptbe ???
azzal semmi gond
de ezek szerint nem lehet crontabba csak úgy beírni, ugye
- A hozzászóláshoz be kell jelentkezni
Néztem mail-t és ezt írja ki;
/bin/sh: -c: line 1: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 2: syntax error: unexpected end of file
miért unexpected?
- A hozzászóláshoz be kell jelentkezni
A topic címéhez egy kicsit ...
A bash programozásánál titokzatosabb, hogy miként programozzák Bush -t.
(Bocs, kicsit flame, de nézzétek el nekem. Ittam pár felest :-) )
- A hozzászóláshoz be kell jelentkezni
Hmmm... nagyon jooo... Miert nem pl. olyan beadando feladatod van, hogy
tar nelkul keszits tar archive-ot, vagy gzip nelkul tomorits, vagy egyeb.
Ez szvsz DOS eseten, ahol nincsenek standard utility-k meg lehet valos
igeny, de UNIX alatt??? Ahol a bc/dc standard util? No, hagyjuk...
Es a sed miert megengedett??? Ha meg az az igenyuk, hogy a
'papiros' osszeadast lekodold pl. bash-ban, akkor miert nem ezt mondjak:
Csak azert, mert jot szorakosztam tehetetlensegeteken itt a hazifeladatotok:
[code:1:9590b5b4dc]
#! /bin/bash
len1=${#1}
len2=${#2}
num1=$1
num2=$2
if [[ len1 -lt len2 ]]
then
len=$len2
len1=$((len1 + 1))
for i in `seq $len1 $len2`
do
num1="0$num1"
done
elif [[ len2 -lt len1 ]]
then
len=$len1
len2=$((len2 + 1))
for i in `seq $len2 $len1`
do
num2=0$num2
done
else
len=$len1
fi
carry=0
len=$((len - 1))
for i in `seq $len -1 0`
do
m1=${num1:$i:1}
m2=${num2:$i:1}
m3=$((m1 + m2 + carry))
mx=${m3:0-1}$mx
if [[ $m3 -gt 9 ]]
then
carry=${m3:0:${#m3} - 1}
else
carry=0
fi
done
echo $mx
[/code:1:9590b5b4dc]
Zsiraf
U.i.: Ha sh-ban kellett, sajnalom, az atultetessel kuzdjetek meg ti :-)
U.i.2: Es ti programozast tanultok??? :oops:
U.i.3: Ha valakinek van meg hazifeladata, csak nyugottan kerdezzen...
- A hozzászóláshoz be kell jelentkezni
[quote:3deb4792b0="vmiklos"][quote:3deb4792b0="Anonymous"]
man [
[code:1:3deb4792b0]vmiklos@vmhome:~# man [
No manual entry for [
[/code:1:3deb4792b0]
vagy ez csak nálam van így? :wink:
igen
(amugy a [ a test parancs rovid neve, lehet h man test -tel menne nalad is)
- A hozzászóláshoz be kell jelentkezni
[quote:06171c49c5="vmiklos"][quote:06171c49c5="Anonymous"]
man [
[code:1:06171c49c5]vmiklos@vmhome:~# man [
No manual entry for [
[/code:1:06171c49c5]
vagy ez csak nálam van így? :wink:
Elivileg (ha jol sejtem) a [ a test hardlinkelt valtozata, (habar nalam arulas van, mert mas a meret??)
ugyhogy ha nincs man [ probald meg man test
arulas van...
A $[ ] bash specifikus?? Lehet, de az eredeti kerdes ugy szolt, hogy hogyan lehet bash-ban nagy szamokat osszeadni... oops... telleg nem bash volt a kerdes.. Sajna... Hat hiaba, ....
A seq annyira linux specifikus, amennyire a GNU coreutils az, azaz semennyire... :-)
Hat igen.. A parancssor argumentum hossza linuxnal (lehet hogy ez POSIX kivanalom..) 32768 byte, tehat elvileg ez hatart szabhat kulso parancsok hivasakor az atadott parametereket illetoen... De jelen esetben ez
tenyleg nem all fenn, ha minden igaz, csak a memoria szab hatart egy for i in list tipusu hivasoknak...
(nalam siman lefut a [code:1:06171c49c5]for i in `seq 1 655360`; do echo $i >>test.txt; done[/code:1:06171c49c5] shellscript :-) ami tobb mint 4M-nyi list-et jelent...
Zsiraf
- A hozzászóláshoz be kell jelentkezni
Sziasztok! Egy vélhetően egyszerű kérdésem van, de én csak szenvedek.
Hogyan lehet bash szkriptben egy sztring részét (mondjuk az első négy karakterét) egy változóba tenni, illetve egy sztring egy adott elemére (karakterére) hivatkozni?
- A hozzászóláshoz be kell jelentkezni
bashben AFAIK nem lehet.
viszont bashbol indithatsz sed-et, perl, awk-t...
- A hozzászóláshoz be kell jelentkezni
U.i.3: Ha valakinek van meg hazifeladata, csak nyugottan kerdezzen...
Nem akarok visszaelni a lehetoseggel, de ha felajanlottad... :)
Nem hazi feladat de mar sokat kuzdottem vele es nem sikerult megoldani...
Hogyan lehet sed-el kiszedni egy allomany minden sorabol a space es tab -okat ugy, hogy az idezojelek " kozott megmaradjanak.
pl:
ebbol (a szokozoket most _ jeloli)
[code:1:c126139fe5]12_34_56_" aa_aa_aa_" 78_99[/code:1:c126139fe5]
ezt
[code:1:c126139fe5]123456aa_aa_aa_7899[/code:1:c126139fe5]
Termeszetesen tobb par idezojel is lehet...
[code:1:c126139fe5]12_34_"aa_aa"_56_"_bb_bb_bb"78_90[/code:1:c126139fe5]
[code:1:c126139fe5]1234aa_aa56_bb_bb_bb7890[/code:1:c126139fe5]
- A hozzászóláshoz be kell jelentkezni
Az még egyikőtöknek sem jutott eszébe, hogy RTFM? Nálam (FreeBSD-n) man 5 crontab tartalmazza a következő bekezdést:
The ``sixth'' field (the rest of the line) specifies the command to be
run. The entire command portion of the line, up to a newline or % char-
acter, will be executed by /bin/sh or by the shell specified in the SHELL
variable of the cronfile. Percent-signs (%) in the command, unless
escaped with backslash (\), will be changed into newline characters, and
all data after the first % will be sent to the command as standard input.
Ha a Ti rendszeretekben a crontab fájl leírása ezt nem tartalmazza, akkor megbocsátható, ekkor esetleg rendszert kéne cserélni. Ha benne van, akkor felhasználót.
Szóval hanyatt-törtvonalat elé!
- A hozzászóláshoz be kell jelentkezni
[quote:49a573df85="szucs_t"]Sziasztok! Egy vélhetően egyszerű kérdésem van, de én csak szenvedek.
Hogyan lehet bash szkriptben egy sztring részét (mondjuk az első négy karakterét) egy változóba tenni, illetve egy sztring egy adott elemére (karakterére) hivatkozni?
[code:1:49a573df85]
fules@chaos:~$ IZE="abcdefgh"; echo ${IZE:2:4}
cdef
[/code:1:49a573df85]
- A hozzászóláshoz be kell jelentkezni
[quote:36ccab9990="Zahy"]
Ha a Ti rendszeretekben a crontab fájl leírása ezt nem tartalmazza, akkor megbocsátható, ekkor esetleg rendszert kéne cserélni. Ha benne van, akkor felhasználót.
Szóval hanyatt-törtvonalat elé!
o jeee:)
johat erre nem is gondoltam zahy
mindig tanul valamit az ember
- A hozzászóláshoz be kell jelentkezni
type [
Gy.k. beépített shell parancs _is_ és külső program _is_. Nyilván előbbinek van elsőbbsége. A man csak a külső parancsokról szól. A beépített bash parancsokról a help ad leírást. A reserved word-ok pedig nem ezekről szólnak, hanem a shell mint programozási nyelv szintaxisa által lefoglalt szavakról (mint ahogyan C-ben a return az foglalt szó, de a strcmp nem, az csak egy függvény neve véletlenül, ha használod a standard libeket, amit egyébként nem kötelező.)
- A hozzászóláshoz be kell jelentkezni
[quote:4b3a49cabc="kami"]Próbáld ki így:
or: if [ -z $str1 -o -z $str2 ] ; then
and: if [ -z $str1 -a -z $str2 ] ; then
vagy így:
if [ -z $str1 ] || [ -z $str2 ] ; then
if [ -z $str1 ] && [ -z $str2 ] ; then
A feltételekben érdemes a $str1, $str2 helyett "$str1"-et, "$str2"-t írni, így nem esik el akkor sem, ha a változó üres.
Üdv: Bálint
- A hozzászóláshoz be kell jelentkezni
[quote:681e6d74e1="lif"]
A másik oldal: A HUP programozási fóruma szellemi koldusok és exhibicionisták találkahelye lett.
Kooosz talalva erzem magam....
Zsiraf
- A hozzászóláshoz be kell jelentkezni
Kedves egmont
A [ beepitett shell parancs lehet, de nem kotelezoen az!!!
Az, hogy melyik preferalt, bash eseten pedig attol fugg, hogy engedelyezve van-e builtin :-) (enable)
A C-vel valo osszehasonlitas termeszetesen santit... A shell(ekben) s built-inek azert
vannak, hogy a "legtobbet" hasznalt util-okat "gyorsabba" tegyek, ne kelljen azokat minden
"egyes esetben" diszk-rol beolvasni (hajajj cache is van am :-)), hanem egy gyors "fuggvenyhivassal" el lehet erni. Side effect, hogy nem biztos azt csinalja, amit az ember elvar, hiszen nem a "kulso" parancs, hanem a shell-be "beforditott" (persze, persze lehet pl. egy .so-ban is :-)) eljaras... Szoval a 'C' nyelv return-ja, es a standard 'C' lib strcmp-je nem "teljesen" ilyen viszonyban vannak, mint a builtin test es a kulso test... A reserved word-el teljesen igazad van...
Szoval, meg egyszer a lenyegre koncentralva, a builtin az nem a shell lenyegi resze/nem a shell programozas lenyegi resze, annyit kell minimalisan tudni rola, hogy hogyan kell kikapcsolni az osszeset, ha biztosra akarsz menni :-). Tulajdonkeppen a shell irok azon hitet jeleniti meg, hogy a shell-be beforditott rutin annyival gyorsabban elerheto, mint egy "kulso", hogy ezert erdemes ilyesmivel szorakozni...
Zsiraf
- A hozzászóláshoz be kell jelentkezni
[quote:f3cc915565="lif"]A nem túl fényes érem egyik oldala: Sokan próbálnak diplomához jutni úgy, hogy a képességeik és/vagy a munkakedvük kevés hozzá.
A másik oldal: A HUP programozási fóruma szellemi koldusok és exhibicionisták találkahelye lett.
Előbbiek az "életrevalóbbak", az utóbbiak egy részét kiszorítják majd a munkahelyekről, a másik részét pedig (a megaláztatásra emlékezve) majd főnökként rúgják ki. Darwin pedig mosolyog.
lif
filozófusnak vagy politikusnak készülsz? :lol:
- A hozzászóláshoz be kell jelentkezni
[quote:fc37cbf851="gsimon"]
[code:1:fc37cbf851]
fules@chaos:~$ IZE="abcdefgh"; echo ${IZE:2:4}
cdef
[/code:1:fc37cbf851]
jo pap is holtig tanul ;)
koszi gsimon :)
- A hozzászóláshoz be kell jelentkezni
[quote:6cf376bedb="looserKa:roll:"]Valaki akinek van kedve erre a pl. írni vmi megoldást?
THX!
Írjon Unix scriptet, ami a paraméterként kapott két tetszőleges hosszúságú (amit a Unix megenged), előjel nélküli numerikus egész stringet összeszorozza, és az eredményt a standard outputra írja.
Ha a szorzás sikerült akkor 0, egyébként (paraméterhiba esetén) 1 legyen a parancs státusz kimenete. Utóbbi esetben a megfelelő hibaüzenet a standard error-ra kerüljön.
A kiindulási adatok tartalmazhatnak értéktelen vezető nullákat, az eredmény nem.
A script nem használhatja a bc és dc parancsokat! (A megoldás a "bc" vagy "dc" stringet sem tartalmazhatja!)
Sziasztok!
Összedobtam egy szerintem lehetséges megoldást, de sajnos nem tudom, hogy jó-e mert papiron csináltam és most nincs módomban kiprobálni, de lehet, hogy jó valamire:
[code:1:6cf376bedb]
A=$1 LA=${#A}
B=$2 LB=${#B}
sor=0
for (( i=0; i=${LB}; i++)) do
for ((j=${LA}; j>=0; j--)) do
szorzat=${B[i]} * ${A[j]}
if ${#szorzat} >1; then
digit=szorzat[2] +atvitel
atvitel=szorzat[1]
else digit=szorzat
atvitel=0
fi
for ((h=0; h=${#sor}; h++)) do
sor[h+1]=sor[h]
done
x=$LA-(i+1)
sor=$(printf "$sor" "%${x}s" | TR " " 0)
done
sum=sum+sor
done
[/code:1:6cf376bedb]
- A hozzászóláshoz be kell jelentkezni
Köszi, jó lesz!
Közben találtam ebben a témában infókat erről.
Kezdtem megijedni, hogy nem tudok megoldani valamit...
- A hozzászóláshoz be kell jelentkezni
Leírnád a teljes scriptet? :lol:
- A hozzászóláshoz be kell jelentkezni
[quote:d1dfc8f8c6="szucs_t"]Közben találtam ebben a témában infókat erről.
Kezdtem megijedni, hogy nem tudok megoldani valamit...
Ezt olvastad már? http://www.tldp.org/LDP/abs/html/
Szerintem a legjobb...
A problémádra konkrétan... http://www.tldp.org/LDP/abs/html/string-manipulation.html
- A hozzászóláshoz be kell jelentkezni
No bazz....
Es ezek programozo diplomat fognak kapni par ev mulva.
Ilyen feladatokat szerintem egy rendes programozo-csemete 6-8 eves koraban kodol le eloszor ZX81-en, vagy Commodore-on....
Ja, Alen Cox meg azert nem fejleszt, mert diplomat szeretne csinalni! Jeee, csak igy tovabb...
- A hozzászóláshoz be kell jelentkezni
azért elég jó, hogy mindenki itt akarja megcsináltatni a háziját...
hozzáteszem, épp most írom havernak ezeket a feladatokat az ELTE-re. a szomorú az, hogy én csinálom meg neki, és mégis ő kap diplomát...
- A hozzászóláshoz be kell jelentkezni
[quote:dc0c1d6250="szaszg"]
No, eloszor is, elegansabb
[code:1:dc0c1d6250]
if [ "$2" != "$test" ]
then
echo Parameter hiba! #OOPs ez forditva volt...
exit 1
fi [/code:1:dc0c1d6250]
helyett:
[code:1:dc0c1d6250][ "$2" != "$test" ] && echo Parameter hiba! && exit 1[/code:1:dc0c1d6250]-t irni..
Sot, javasolnam inkabb a :
[code:1:dc0c1d6250][ "$2" != "$test" ] && echo "$0: Parameter hiba!" >&2 && exit 1[/code:1:dc0c1d6250] megoldast.
- A hozzászóláshoz be kell jelentkezni
j=`echo $i tr -d ' '`
- A hozzászóláshoz be kell jelentkezni
Nem akartam ilyen részletekig belemenni, hogy az enable paranccsal letilthatók/engedélyezhetők a bash parancsok Nyilván a külső [ is letiltható, kiveszed a PATH-ból :-) Csak a bash defaultját akartam felvázolni. Szóval standard Linux default beállításaival bash alatt ha valaki azt írja, hogy [, akkor az egy beépített bash parancs, help [ és help test ad róla doksit, nem a man page.
A C-vel vont párhuzam szerintem egyáltalán nem sántít, mindkét nyelv esetén tök ugyanúgy élesen szét lehet választani a nyelv szintaktikája által lefoglalt szavakat az általában valamilyen funkcióra előre kivitelezett függvények/parancsok szavaitól.
bash-ben totál nem igaz általánosan, hogy a beépített parancsok a külső parancsok gyorsítását szolgálják. Némelyikre igaz, például a [ vszleg ilyen. De számtalan olyan beépített parancs van, amelyik nem oldható meg külső programként. Csak hogy ízelítőül említsek egy-kettőt: cd (külső processz nem tudja a bash munkakönyvtárát megváltoztatni), kill (a job ID (például %1) alapján történő kilövéshez, hiszen külső processznek fingja nincs a %1 jelentéséről), fg, bg (nyilván), enable (annak szabályozására, hogy a többi beépített bash parancs működjön-e) stb... a beépített parancsok többsége ilyen. Erre a szétválasztásra (szükségszerűen beépített parancs vs. csak külső parancs gyorsítása) is megvan a C-beli hasonlat a gcc fordító esetén: akármennyire is hihetetlen, bizonyos totál standard függvények kivitelezése a gcc-ben is megtalálható, gyorsabb mint a glibc-ben lévő verzióhoz linkelni.
- A hozzászóláshoz be kell jelentkezni
Na jó, ez a legutolsó mondatomban húzott párhuzam már tényleg nagyon erőltetettre sikerült.
- A hozzászóláshoz be kell jelentkezni
[quote:4e0a86d68b="miq"]No bazz....
Es ezek programozo diplomat fognak kapni par ev mulva.
Ilyen feladatokat szerintem egy rendes programozo-csemete 6-8 eves koraban kodol le eloszor ZX81-en, vagy Commodore-on....
Ja, Alen Cox meg azert nem fejleszt, mert diplomat szeretne csinalni! Jeee, csak igy tovabb...
Hat ezaz!! ettol felek en is! :evil:
Zsiraf
- A hozzászóláshoz be kell jelentkezni
[quote:bb24e70b08="egmont"]Na jó, ez a legutolsó mondatomban húzott párhuzam már tényleg nagyon erőltetettre sikerült.
Annyira talán nem erőltetett... Egyszer néztem én is nagyot, mikor vmi .c-ből asm kódot csináltattam gcc-vel, aztán a kb olyasmit találtam, h a memcpy(hova, mit, 4)-et MOV-nak fordította...
- A hozzászóláshoz be kell jelentkezni
[quote:3e1362bfa1="looserKa:roll:"]Valaki akinek van kedve erre a pl. írni vmi megoldást?
THX!
Írjon Unix scriptet, ami a paraméterként kapott két tetszőleges hosszúságú (amit a Unix megenged), előjel nélküli numerikus egész stringet összeszorozza, és az eredményt a standard outputra írja.
Ha a szorzás sikerült akkor 0, egyébként (paraméterhiba esetén) 1 legyen a parancs státusz kimenete. Utóbbi esetben a megfelelő hibaüzenet a standard error-ra kerüljön.
A kiindulási adatok tartalmazhatnak értéktelen vezető nullákat, az eredmény nem.
A script nem használhatja a bc és dc parancsokat! (A megoldás a "bc" vagy "dc" stringet sem tartalmazhatja!)
Mondam mar!! Keresd meg a sed-ben implementalt bc-t s hasznald azt.. (ha ezt nem tudod megirni... persze, akkor erosen ketlem, hogy azt hasznalni tudnad...)
Zsiraf
- A hozzászóláshoz be kell jelentkezni
Pár apróságra reagálnék.
Mint az korábban is elhangzott, az eredeti kérdés "shell"-ről szólt, és ha már az adott oldal karbantartója (Trey) szerint ez egy UNIX (nem Linux) oldal, akkor hadd beszéljünk kicsit általánosabban, kevésbé Linux-specifikus módon. (Azon lehet vitatkozni, hogy mi a shell, és melyik az igazi, de itt minek. Btw: Linux használók többségének - tapasztalatom alapján - bash "a shell", nekem ezzel szemben a ksh, megint másoknál (t)csh, és í. t. )
Szóval:
a) az, hogy egy for seq ciklus okoz(hat)-e problémát (arg list too long), az erőteljesen shell-megvalósítás - és használat - függő. (Ez itt egy viszonylag ismert shell doksijának részlete:
BTW, the most frequently reported bug is
echo hi | read a; echo $a # Does not print hi
I'm aware of this and there is no need to report it.
Ez egyébként az elterjedtebb shellekben persze kiírja a "hi"-t, viszont ebben a shellben a pipe-ok-nál még a shell belső parancsoknál is létrejön egy plusz új processz ...)
b) abból, hogy a seq a GNU coreutils része, már megint csak az következik, amit mondtam: gyakorlatilag sehol nem sztenderd, csak Linux körökben :-( (Legalábbis tudtommal IBM, HP (Compaq/DEC), Sun, stb nem ezt adja alapból, legfeljebb telepíteni lehet(?), mint a bash-t is.)
No mindegy, ez eléggé parttalan vita.
Zahy
- A hozzászóláshoz be kell jelentkezni
[quote:d998efe2e4="Anonymous"]
abból, hogy a seq a GNU coreutils része, már megint csak az következik, amit mondtam: gyakorlatilag sehol nem sztenderd, csak Linux körökben :-( (Legalábbis tudtommal IBM, HP (Compaq/DEC), Sun, stb nem ezt adja alapból, legfeljebb telepíteni lehet(?), mint a bash-t is.)
Nem tudom, ki hogyan van vele, de nekem IRIX-en es AIX-en is elso dolgom volt, hogy forditottam ra bash-t, aztan meg szepen sorban a GNU-s progikat...
- A hozzászóláshoz be kell jelentkezni
[quote:390fc00c04="Anonymous"]b) abból, hogy a seq a GNU coreutils része, már megint csak az következik, amit mondtam: gyakorlatilag sehol nem sztenderd, csak Linux körökben :-(
Ez baromira nem következik belőle. Nézd meg, az ls, rm, cp és társaik is a GNU coreutils részei. Akkor ezek sem standardek, hanem Linux-specifikusak??? Ugye hogy hibás volt a következtetés gondolatmenete?
Nyilván más rendszereken nem a GNU coreutils-ból származó seq, hanem másmilyen seq található meg. Kíváncsian várom konkrét Unixok megnevezését, ahol nincs seq :-)
- A hozzászóláshoz be kell jelentkezni
de nem lehet bc dc stinget.
azért nem megy.
vagyis megvan de nagy szamok eseten(10<...)
nem mükszik.
so?
- A hozzászóláshoz be kell jelentkezni
[quote:5dbc0f6a3b="szaszg"]Hmmm... nagyon jooo...
Csak azert, mert jot szorakosztam tehetetlensegeteken itt a hazifeladatotok:
U.i.: Ha sh-ban kellett, sajnalom, az atultetessel kuzdjetek meg ti :-)
U.i.2: Es ti programozast tanultok??? :oops:
U.i.3: Ha valakinek van meg hazifeladata, csak nyugottan kerdezzen...
Akkor ha megengeded, kijavítottam a programodat. Csak két apró hibát találtam: egyjegyű számokat nem tudott összeadni, illetve 33 + 67 = 00 eredményt adott. Ezeket javítottam, nem volt nehéz, mint látod.
[code:1:5dbc0f6a3b]#!/bin/bash
len1=${#1}
len2=${#2}
num1=$1
num2=$2
if [[ $len1 -eq 1 ]] && [[ $len2 -eq 1 ]]
then
echo $(($1 + $2))
exit
fi
if [[ $len1 -lt $len2 ]]
then
len=$len2
len1=$((len1 + 1))
for i in `seq $len1 $len2`
do
num1="0$num1"
done
elif [[ $len2 -lt $len1 ]]
then
len=$len1
len2=$((len2 + 1))
for i in `seq $len2 $len1`
do
num2=0$num2
done
else
len=$len1
fi
carry=0
len=$((len - 1))
for i in `seq $len -1 0`
do
m1=${num1:$i:1}
m2=${num2:$i:1}
m3=$((m1 + m2 + carry))
mx=${m3:0-1}$mx
if [[ $m3 -gt 9 ]]
then
carry=${m3:0:${#m3} - 1}
else
carry=0
fi
done
if [[ $carry -gt 0 ]]
then
mx=$carry$mx
fi
echo $mx[/code:1:5dbc0f6a3b]
Használjátok egészséggel...
Ui: Köszi az eredetit, sokat tanultam belőle, amit suliban se mondtak.
- A hozzászóláshoz be kell jelentkezni
[quote:a4f1e2a818="doc"]azért elég jó, hogy mindenki itt akarja megcsináltatni a háziját...
hozzáteszem, épp most írom havernak ezeket a feladatokat az ELTE-re. a szomorú az, hogy én csinálom meg neki, és mégis ő kap diplomát...
Nem küldöd el nekem is?
pliz
amar@pro.hu
megköszönném.
- A hozzászóláshoz be kell jelentkezni
[quote:271039569a="egmont"]Nyilván más rendszereken nem a GNU coreutils-ból származó seq, hanem másmilyen seq található meg. Kíváncsian várom konkrét Unixok megnevezését, ahol nincs seq :-)
AIX, FreeBSD, OpenBSD, OS X
eleg lesz? ezeken tudtam hirtelen megnezni.
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Az lenne nekem a nagy problámám, hogy van egy nagy könyvtárendszer, ami windows alatt készült és a könyvtárak neveiben vegyesen vannak kis és nagy betük. Ez mind szép és jó, csak a linux nem rendezi abc sorrendbe, és így nehéz benne keresgélni, de ha a nagy betűket kijavítanám kicsikre, az nagyon jó lenne. Van-e valakinek valamilyen szkriptje, ami ezt egy kicsit meggyorsítaná, a fájlok neveit nem kell változtatni.
Köszi
- A hozzászóláshoz be kell jelentkezni
[quote:b612fa6e8c="vili"]eleg lesz? ezeken tudtam hirtelen megnezni.
Elég. Elfogadom, hogy a seq nem standard, de akkor is tartom hogy Zahy hibás gondolatmenettel jutott el erre a következtetésre :-)
- A hozzászóláshoz be kell jelentkezni
Hi!
Szerintem folosleges azon osszeveszni, hogy mi minek a resze. Ehhez elobb pontosan definialni kell azt, hogy valami valaminek a resze. Pl. a DOS-nak resze-e az xcopy? Nezet kerdese.
By(t)e
TBS::Antiemes
- A hozzászóláshoz be kell jelentkezni
[quote:ddbe48ca7f="egmont"][quote:ddbe48ca7f="vili"]eleg lesz? ezeken tudtam hirtelen megnezni.
Elég. Elfogadom, hogy a seq nem standard, de akkor is tartom hogy Zahy hibás gondolatmenettel jutott el erre a következtetésre :-)
Hiába tartod, mert logikailag valóban nem voltam pontos, ezzel szemben ez nem gondolatkísérlet alapján jött, hanem gyakorlati tapasztalat. És Vili előző listáját kibővíteném még néhánnyal:
NetBSD, HP-UX, DEC/Compaq/HP Tru64, Minix, Solaris
elég lesz? :-)
miq-nek meg csak annyit, hogy az, hogy valaki mit szokott elsőre föltelepíteni, az nem sokat jelent, ha csak azt nem, hogy onnan Neki mi hiányzik :-D
(Magánmorgás: a bash-t elvakultan telepítők _többsége_ csak azért telepít bash-t, mert nem olvasta soha végig figyelmesen a ksh doksiját, és nem tudja, hogy kell a history-t kurzormozgató billentyűkkel előhozni, illetve a fájlnévkiegészítést előcsalogatni - no jó nem TAB-bal, hanem ESC-ESC-pel, de ez is csak szokás kérdése. Persze a jelenlevők mindig kivételek.)
Zahy
Ja, aki man-t akar keresgélni, annak egy aprócska FreeBSD-s oldal: http://www.freebsd.org/cgi/man.cgi
- A hozzászóláshoz be kell jelentkezni
[code:1:d635e27f69]cat menu_and_footer.css | sed -r 's/^[[:space:]]*/ /g;/^[^{}]+$/s/^(.)/ \1/;s/^ //' | egrep -v '^[[:space:]]*$' >x[/code:1:d635e27f69]
A fenti kóddal oldottam meg, hogy egy css fájlban össze-vissza lévő behúzások úgy módosuljanak, hogy mindegyik így nézzen ki:
[code:1:d635e27f69]#menu-main {
text-align: right;
padding-right: 70px;
}[/code:1:d635e27f69]
Az első utasítás eltünteti az összes szóközt a sor elejéről, számomra érthetetlen módon. Gondoltam, akkor visszarakom őket, de csak a '{' vagy '}' karaktereket nem tartalmazó sorokra kell. A második sed utasítás:
[code:1:d635e27f69]/^[^{}]+$/s/^(.)/ \1/[/code:1:d635e27f69]
Ebben a formában az első karakter elé beszúr 2, azaz kettő darab szóközt. Azon sorokra, amiben '{' és '}' van, nem kellene illeszkednie, oda csak egy karakter kerül. Ellenben ha így írom:
[code:1:d635e27f69]/^[^{}]+$/s/^([^ ])/ \1/[/code:1:d635e27f69]
akkor meg fogja magát, és nem csinál semmit. Ugyebár az első karakter tutira nem szóköz az első helyettesítés eredménye miatt.
A harmadikkal eltüntetetem az első szóközt, az legalább megy.
Kérdés: ez miért így működik?
- A hozzászóláshoz be kell jelentkezni
*********************************************************
A=$1;LA=${#A}
B=$2;LB=${#B}
if [ $LA -gt $LB ] ; then B=$(printf "%${LA}s" "$B"| tr " " 0) LC=$LA;
else A=$(printf "%${LB}s" "$A"| tr " " 0) LC=$LB;
fi
M=0
for ((i=$[LC-1];i>=0;i--)) ;do
S=$[${A:$i:1}+${B:$i:1}+$M]
C="$[S%10]$C"
M=$[S/10]
done
echo $M$C|sed "s/^0*//"
*********************************************************
Szeretném tudni a következő Kódrészek jelentését:
1. B=$(printf "%${LA}s" "$B"| tr " " 0)
2. ${A:$i:1}
- A hozzászóláshoz be kell jelentkezni
Nem vagyok egy nagy sed guru (hogy egészen pontos legyek eddig alig használtam), de azért a reguláris kifejezésekben eligazodom...
[quote:37ba324cb2="Panther"][code:1:37ba324cb2]cat menu_and_footer.css | sed -r 's/^[[:space:]]*/ /g;/^[^{}]+$/s/^(.)/ \1/;s/^ //' | egrep -v '^[[:space:]]*$' >x[/code:1:37ba324cb2]
Az első utasítás eltünteti az összes szóközt a sor elejéről, számomra érthetetlen módon.
Nem egészen.
[code:1:37ba324cb2]s/^[[:space:]]*/ /g[/code:1:37ba324cb2]
Ez, ha a sor elején nincsen szóköz, akkor beszúr egyet, ha pedig van több is, akkor abból egyet csinál.
[quote:37ba324cb2="Panther"]
[code:1:37ba324cb2]/^[^{}]+$/s/^(.)/ \1/[/code:1:37ba324cb2]
Ebben a formában az első karakter elé beszúr 2, azaz kettő darab szóközt. Azon sorokra, amiben '{' és '}' van, nem kellene illeszkednie, oda csak egy karakter kerül.
Ez az 's' előtt is egy reguláris kifejezés forma nekem nem ismerős, de felteszem egy előszűrést jelent - vagyis a replace csak azokra a sorokra hajtódi végre, amik megfelelnek a szűrő reguláris kifejezésnek (vagyis nem '{' és nem '}' karakterrel kezdődnek).
Ezek után az összes ilyen sor elejére beszúr még egy szóközt (tehát eddigre a nem '{' és nem '}' karakterrel kezdődő sorok előtt 1, a többi előtt 2 szóköz szerepel).
[quote:37ba324cb2="Panther"]
Ellenben ha így írom:
[code:1:37ba324cb2]/^[^{}]+$/s/^([^ ])/ \1/[/code:1:37ba324cb2]
akkor meg fogja magát, és nem csinál semmit. Ugyebár az első karakter tutira nem szóköz az első helyettesítés eredménye miatt.
Épp ellenkezőleg. Az első helyettesítés miatt mindegyik előtt van pontosan egy szóköz.
[quote:37ba324cb2="Panther"]
A harmadikkal eltüntetetem az első szóközt, az legalább megy.
Kérdés: ez miért így működik?
Egészen pontosan az történik, hogy az első lépésben minden sor elejére beraksz pontosan egy szóközt, a második lépésben a nem '{' és nem '}' karakterrel kezdődő sorok elé beszúrsz mégegyet, majd mindegyik sor elől törölsz egyet. Futsz egy felesleges kört, úgy hiszem...
Próbáld meg inkább így:
[code:1:37ba324cb2]s/^[[:space:]]*//g;/^[^{}]+$/s/^(.)/ \1/[/code:1:37ba324cb2]
HTH:
Babszem.
PS: Ebben nem vagyok 100%-ig biztos, de azt hiszem még egy kicsit lehet egyszerűsíteni:
[code:1:37ba324cb2]s/^[[:space:]]*//g;/^[^{}]+$/s/^/ /[/code:1:37ba324cb2]
- A hozzászóláshoz be kell jelentkezni
[quote:19158f8fae="looserKa"]de nem lehet bc dc stinget.
azért nem megy.
vagyis megvan de nagy szamok eseten(10<...)
nem mükszik.
so?
rotfl!!!
Zsiraf
- A hozzászóláshoz be kell jelentkezni
[quote:fc66a65ec2="szaszg"][quote:fc66a65ec2="looserKa"]de nem lehet bc dc stinget.
azért nem megy.
vagyis megvan de nagy szamok eseten(10<...)
nem mükszik.
so?
rotfl!!!
Zsiraf
???
- A hozzászóláshoz be kell jelentkezni
[quote:91338569b5="feca"]Sziasztok!
de ha a nagy betűket kijavítanám kicsikre, az nagyon jó lenne.
chcase
http://www.blemished.net/chcase.html
Vagy ez így hirtelen:
#!/bin/sh
find "$1" -type f -name '*' |
while read oldname ; do
NEW=`echo "$oldname" | tr [:upper:] [:lower:]`
mv "$oldname" "$NEW"
done
- A hozzászóláshoz be kell jelentkezni
Hogyan lehet egyszerüen eldönteni, hogy egy szkript összes paramétere csak számjegyeket tartalmaz e?
- A hozzászóláshoz be kell jelentkezni
Zsiraf
Segitesz nekem?
vagy?
csak bántani akarsz?
nem tehetek róla hogy nem tom.
mert ha nem akkor mailbe elküldöm az eddigi megoldasom és megnézhetnénk h mit is akarok.
thx
- A hozzászóláshoz be kell jelentkezni
[quote:9822a67935="pallas"]Szeretném tudni a következő Kódrészek jelentését:
1. B=$(printf "%${LA}s" "$B"| tr " " 0)
2. ${A:$i:1}
Első: RTFM.
Második: is.
Tréfát félretéve: nézd meg egy kicsit alaposabban, s ha valaha is programoztál gyakorlatilag bármilyen nyelven, akkor rájössz, hogy az első a zero padding, a második meg a változó i-dik karaktere.
Asszem.
- A hozzászóláshoz be kell jelentkezni
Kedves Zahy!
En nem azt mondtam, hogy a seq mindenhol letezik/standard unix util, csak azt, hogy nem Linux specifikus, mivel a GNU coreutils resze... Az, hogy a linux disztribek mind atveszik, es mondjuk a HP/Solaris/IBM nem, az nem tartozik a keredes lenyegehez...
Zsiraf
U.i.: [code:1:d21ce89a4e]echo hi | (read a; echo $a)[/code:1:d21ce89a4e] Az, hogy a pipe-nal letrejon-e egy uj processz az hmm... hat anelkul, hogy futna egyszerre az echo hi es a read a ??? varom az otleteket....
- A hozzászóláshoz be kell jelentkezni
[quote:cd88802fca="boobaa"][quote:cd88802fca="pallas"]Szeretném tudni a következő Kódrészek jelentését:
1. B=$(printf "%${LA}s" "$B"| tr " " 0)
2. ${A:$i:1}
Első: RTFM.
Második: is.
Tréfát félretéve: nézd meg egy kicsit alaposabban, s ha valaha is programoztál gyakorlatilag bármilyen nyelven, akkor rájössz, hogy az első a zero padding, a második meg a változó i-dik karaktere.
Asszem.
:-)
- A hozzászóláshoz be kell jelentkezni
[quote:ed814c8e1b="looserKa"]Zsiraf
Segitesz nekem?
vagy?
csak bántani akarsz?
nem tehetek róla hogy nem tom.
mert ha nem akkor mailbe elküldöm az eddigi megoldasom és megnézhetnénk h mit is akarok.
thx
Kuld...
Megnezzuk mit is akarsz...
Zsiraf
U.i.: :-)
- A hozzászóláshoz be kell jelentkezni
Még valami lemaradt:)))
2. Hogyan lehet awk-val egy tetszőleges hosszuságu sztringet karakterenként beolvasni egy tömbbe?
üdv
pallas
- A hozzászóláshoz be kell jelentkezni
boobaa írta:
pallas írta:
Szeretném tudni a következő Kódrészek jelentését:
1. B=$(printf "%${LA}s" "$B"| tr " " 0)
2. ${A:$i:1}
Első: RTFM.
Második: is.
Tréfát félretéve: nézd meg egy kicsit alaposabban, s ha valaha is programoztál gyakorlatilag bármilyen nyelven, akkor rájössz, hogy az első a zero padding, a második meg a változó i-dik karaktere.
Asszem.
****************************************
Ezzel nem lettem okosabb:(
[=][:c1ac77b092][code:1:c1ac77b092][quote][u][i][b][/b][/i][/u][/quote][/code:1:c1ac77b092][/:u:c1ac77b092][/]
[/]
- A hozzászóláshoz be kell jelentkezni
[quote:2027714b2d="pallas"]
Szeretném tudni a következő Kódrészek jelentését:
1. B=$(printf "%${LA}s" "$B"| tr " " 0)
2. ${A:$i:1}
RTFM helyett javasolnek harom parancsot:
1.) man bash
2.) man printf
3.) man tr
- A hozzászóláshoz be kell jelentkezni
[quote:271853b841="egmont"][quote:271853b841="szaszg"]Nalatod, szoval uj processz KELL!
Egyáltalán nem KELL új processz. Vszleg így a legegyszerűbb leprogramozni, de így nem elég kényelmes a fent felvázoltak miatt a felhasználó számára.
Komplett perl progik képesek ezerszer többet megcsinálni egy shell-nél, egy processzben. De egy processzben akár egy usermode linux vagy vmware (komplett linux- illetve hardver-emulátor) is elfér. Tehát a shellnél is csak ügyes programozás kérdése, hogy a fent felvázolt pipe-ot le bírják-e programozni egy processzben. Egyáltalán nem lehetetlen.
No, azt hiszem azert itt van nemi ertelmezesi problema...
A pipe | arra valo, hogy ket futo program (alias process) stdout-jat es stdin-jet osszekosse. Tehat KET FUTO PROGRAM!!! Ez az alap. Azutan erre jonnek ra az olyan izek, amikor az egyik, vagy masik vagy mindket "program" pl. egy shell builtin... Ennek a dolognak, mar ne haragudj, semmi koze ahoz, hogy mi fer el egy processzben: web szerver, gaussian, quake3, emulator, vagy csak egy helo world... teljesen lenyegtelen. Ha van ket programod, aminek egy pipe-al osszekotod a stdout-jat es stdin-jet, akkor oda ket process KELL. Ha az egyik "process" a read, (ami mivel shell builtin tulajdonkeppen egy shellt jelent) akkor mar lehet fantazialni arrol, hogy esetleg az egesz pipe-ot intezze el a shell belso ugykent, vagy ne... De ismetlem, ennek semmi koze, hogy mit csinal egy process, bonyolult dolgot, vagy egyszerut.
Mi nem kenyelmes?? Talan azt is mondhatjuk, hogy pl 3+3 = 6 es sajna ez nem kenyelmes, mert hogy 9 legyen, meg 3-at hozza kell adni!!!
mondom [code:1:271853b841]a=`echo hi`[/code:1:271853b841]. A read alapvetoen arra valo, hogy a felhasznalotol (a konzolrol) olvasson be valamit, nem arrol hogy pipe-al fifo-val etesd. Ha megis azt akarod, akkor figyelj oda. Hogy kulso program stdout-jat valtozoba tedd arra a $() es `` shell direktivak valok.
Persze, szablyaval is lehet enni, de ahoz, hogy felvagd a hust, lehet hogy az asztaltol fel kell allnod. Mondhatod, hogy ez sz*r, meg nem felhasznalobarat, es hogy milyen jo kumbimbam-ban, mert ott olyan jol megcsinaltak a kardot, hogy ulve se vagod le vele a szembelevo hajat, de ne haragudj zabalni a kes jo... nem a kard...
Zsiraf
- A hozzászóláshoz be kell jelentkezni
[quote:cdc721f24a="pallas"]Még valami lemaradt:)))
2. Hogyan lehet awk-val egy tetszőleges hosszuságu sztringet karakterenként beolvasni egy tömbbe?
üdv
pallas
[code:1:cdc721f24a]info gawk:
...
Making Each Character a Separate Field
--------------------------------------
There are times when you may want to examine each character of a
record separately. This can be done in `gawk' by simply assigning the
null string (`""') to `FS'. In this case, each individual character in
the record becomes a separate field. For example:
$ echo a b | gawk 'BEGIN { FS = "" }
> {
> for (i = 1; i <= NF; i = i + 1)
> print "Field", i, "is", $i
> }'
-| Field 1 is a
-| Field 2 is
-| Field 3 is b
Traditionally, the behavior of `FS' equal to `""' was not defined.
...
[/code:1:cdc721f24a]
A tobbit rad bizom. a print "Field", i, "is", $i reszt kell egy kicsit atirni :-)
Zsiraf
U.i.: Igen igen... Ez a gawk. Mas awk-ban ez nem biztos hogy
mukodik...
U.i.: Legkozelebb megprobalom ugy implementalni, hogy DOS batch-ben, sh-ban, ksh-ban, python-ban, c++-ban, fortranban (ja nem, fuj, azt utaljuk), JAVA-ban, PHP-ban, JavaScript-ben, VisualBasic-ban is fusson, kulonosebb erolkodes nelkul...
- A hozzászóláshoz be kell jelentkezni
so
enyit sikerült kihoznom:
test=`echo "$1" | tr -d [:alpha:]`
echo "$1" ==== "$test"
if [ "$1" != "$test" ]
then
echo Parameter hiba!
exit 1
fi
test=`echo "$2" | tr -d [:alpha:]`
echo "$2" ==== "$test"
if [ "$2" != "$test" ]
then
exit 1
echo Parameter hiba!
fi
echo elso=$1
echo masodik=$2
echo $(($1*$2))
exit 0
Szóval ez lenne de hosszú számokra nem mükszik.
vélemény?
- A hozzászóláshoz be kell jelentkezni
[quote:afb2419c84="Babszem"]Nem egészen.
[code:1:afb2419c84]s/^[[:space:]]*/ /g[/code:1:afb2419c84]
Ez, ha a sor elején nincsen szóköz, akkor beszúr egyet, ha pedig van több is, akkor abból egyet csinál.
Hoppá, tényleg. Ezt rendszeresen elnéztem. Köszi :)
- A hozzászóláshoz be kell jelentkezni
[quote:10b69a343e="looserKa"]so
enyit sikerült kihoznom:
test=`echo "$1" | tr -d [:alpha:]`
echo "$1" ==== "$test"
if [ "$1" != "$test" ]
then
echo Parameter hiba!
exit 1
fi
test=`echo "$2" | tr -d [:alpha:]`
echo "$2" ==== "$test"
if [ "$2" != "$test" ]
then
echo Parameter hiba! #OOPs ez forditva volt...
exit 1
fi
echo elso=$1
echo masodik=$2
echo $(($1*$2))
exit 0
Szóval ez lenne de hosszú számokra nem mükszik.
vélemény?
No, eloszor is, elegansabb
[code:1:10b69a343e]
if [ "$2" != "$test" ]
then
echo Parameter hiba! #OOPs ez forditva volt...
exit 1
fi [/code:1:10b69a343e]
helyett:
[code:1:10b69a343e][ "$2" != "$test" ] && echo Parameter hiba! && exit 1[/code:1:10b69a343e]-t irni..
Amugy gondolhatod, hogy nem a $((a*b))-t kerik HF-nek!!!! Javaslom
nezd at a nagyszamokat osszeadot es az alapjan alkosd meg a szorzot. Mint mar emlitettem a legjobb, ha a papir alapu szorzast probalod meg kodolni...
Zsiraf
- A hozzászóláshoz be kell jelentkezni
oksa!
probálkozom.
thx
- A hozzászóláshoz be kell jelentkezni
[quote:676ce377d8="szaszg"][quote:676ce377d8="miq"]Nem az en dontesem, de feltetelezem, hogy ez a feladat ki sem lesz javitva.
Egyebkent, en nem szeretek sokat olvasni, ezert inkabb egy ilyen kis rovid megoldasnak orulok:
[code:1:676ce377d8]
A=$1;LA=${#A}
B=$2;LB=${#B}
if [ $LA -gt $LB ] ; then B=$(printf "%${LA}s" "$B"| tr " " 0) LC=$LA;
else A=$(printf "%${LB}s" "$A"| tr " " 0) LC=$LB;
fi
M=0
for ((i=$[LC-1];i>=0;i--)) ;do
S=$[${A:$i:1}+${B:$i:1}+$M]
C="$[S%10]$C"
M=$[S/10]
done
echo $M$C|sed "s/^0*//"
[/code:1:676ce377d8]
Hat igen, a tr az bash parancs? ezen kivul a [ szinten kulso parancs, sot meg a sed is! (no jo, a seq is, de az viszonylag egyszeruen helyettesitheto, mig az elozo ketto NEM). S ha mar a sed ellen nincs kifogasunk, akkor a bc ellen miert van??
Zsiraf
U.i.: amugy szerintem elegansabb, a 18digit-es megoldas :-)
Mit jelent a ${#A}???
- A hozzászóláshoz be kell jelentkezni
[quote:977f8654c0="pallas"]Mit jelent a ${#A}???
RTFM
Zsiraf
U.i.: Amugy az A valtozoban levo "string" hossza...
- A hozzászóláshoz be kell jelentkezni
nem megy:(
nem nézed meg és írod át nekem? :cry:
- A hozzászóláshoz be kell jelentkezni
[quote:3a3c393afd="boobaa"]
Akkor ha megengeded, kijavítottam a programodat. Csak két apró hibát találtam: egyjegyű számokat nem tudott összeadni, illetve 33 + 67 = 00 eredményt adott. Ezeket javítottam, nem volt nehéz, mint látod.
[code:1:3a3c393afd]#!/bin/bash
...
len=$((len - 1))
...
if [[ $carry -gt 0 ]]
then
mx=$carry$mx
fi
echo $mx[/code:1:3a3c393afd]
Használjátok egészséggel...
Ui: Köszi az eredetit, sokat tanultam belőle, amit suliban se mondtak.
Koszi!! lol:
Igy mar telleg jo... :lol:
Zsiraf
U.i.: Ja, az elejen az alabbiaknak semmi ertelme:
[code:1:3a3c393afd]if [[ $len1 -eq 1 ]] && [[ $len2 -eq 1 ]]
then
echo $(($1 + $2))
exit
fi
[/code:1:3a3c393afd]
igy ezt nyugottan kikommentezheted (de megjobb, ha torlod :lol: )
Az igazi problema a carry vegso hozzaadasanak hianya volt :-)
U.i.2: Persze meg lehet irni gyorsabbra is, pl ugy, hogy nem szamjegyenkent
adod ossze, hanem mondjuk 18 szamjegyenkent (ennyit meg a bash jol
ad ossze) Ilyenkor mindig az eredmeny utolso 18 szamjegye a kesz osszeg,
a carry pedig a 19. stb...
- A hozzászóláshoz be kell jelentkezni
[quote:5a86780b76="feca"]Sziasztok!
Az lenne nekem a nagy problámám, hogy van egy nagy könyvtárendszer, ami windows alatt készült és a könyvtárak neveiben vegyesen vannak kis és nagy betük. Ez mind szép és jó, csak a linux nem rendezi abc sorrendbe, és így nehéz benne keresgélni, de ha a nagy betűket kijavítanám kicsikre, az nagyon jó lenne. Van-e valakinek valamilyen szkriptje, ami ezt egy kicsit meggyorsítaná, a fájlok neveit nem kell változtatni.
Köszi
rename 'y/[:lower:]/[:upper:]/' *
Zsiraf
p.s.: ja, a rename a perl resze :-)
- A hozzászóláshoz be kell jelentkezni
Valahogy éreztem, hogy nem fogod végigolvasni... Szóval:
1. Zero padding, azaz a szám kellő hosszúságban bevezető nullákkal.
2. A változó i-dik karaktere, azaz az A változó i-dik karakterétől kezdődően 1 karakter.
Ennél jobban szájbarágni nem tudom :oops: - de azt tartom, hogy aki már programozott valaha, annak még a man bash; man printf; man tr parancsokra se lett volna szüksége :oops: . Mindazonáltal ott tényleg megtalálod (legalábbis valószínűleg - ha miq így írta, biztos így is van, én nem néztem).
Apropó, Trey: hogyan hozod elő ezeket a jó kis emotikonokat? Mert én nem találom őket, mint pl. ezt a súgós fickót.
- A hozzászóláshoz be kell jelentkezni
[quote:66a32b483d="maszili"]
Nem akarok visszaelni a lehetoseggel, de ha felajanlottad... :)
Nem hazi feladat de mar sokat kuzdottem vele es nem sikerult megoldani...
Hogyan lehet sed-el kiszedni egy allomany minden sorabol a space es tab -okat ugy, hogy az idezojelek " kozott megmaradjanak.
pl:
ebbol (a szokozoket most _ jeloli)
[code:1:66a32b483d]12_34_56_" aa_aa_aa_" 78_99[/code:1:66a32b483d]
ezt
[code:1:66a32b483d]123456aa_aa_aa_7899[/code:1:66a32b483d]
Termeszetesen tobb par idezojel is lehet...
[code:1:66a32b483d]12_34_"aa_aa"_56_"_bb_bb_bb"78_90[/code:1:66a32b483d]
[code:1:66a32b483d]1234aa_aa56_bb_bb_bb7890[/code:1:66a32b483d]
Talan ez a script megteszi, habar az unbalanced "-nel az utolsot meghagyja...
[code:1:66a32b483d]#n
/"/! s/ //gp
/"/ {
s/[ \t]\+"/"/
s/^/"\n/
:a
s/"/"\n/2
:b
s/\(\n.*\)[ \t]\+\([^ \t]*"\n\)/\1\2/
t b
s/"\n[^"]*$/&/
t c
s/\n//g
s/"//
s/"//
s/"/"\n/
b a
:c
s/\("\n.*\)[ \t]\+\([^ \t]*\)$/\1\2/
t c
s/\n//g
s/"//p
}
[/code:1:66a32b483d] A futtatasa:
[code:1:66a32b483d]sed -f xxx.sed allomanyod.txt[/code:1:66a32b483d]
Zsiraf
U.i.: a #n az elejen a parancssori -n kapcsolot helyettesiti...
- A hozzászóláshoz be kell jelentkezni
[quote:b89e7299fa="boobaa"]
Apropó, Trey: hogyan hozod elő ezeket a jó kis emotikonokat? Mert én nem találom őket, mint pl. ezt a súgós fickót.
http://www.hup.hu/modules/Forums/images/smiles/ :D
- A hozzászóláshoz be kell jelentkezni
[quote:b1f13eec0c="szaszg"]Hmmm... nagyon jooo... Miert nem pl. olyan beadando feladatod van, hogy
tar nelkul keszits tar archive-ot, vagy gzip nelkul tomorits, vagy egyeb.
Ez szvsz DOS eseten, ahol nincsenek standard utility-k meg lehet valos
igeny, de UNIX alatt??? Ahol a bc/dc standard util? No, hagyjuk...
Es a sed miert megengedett??? Ha meg az az igenyuk, hogy a
'papiros' osszeadast lekodold pl. bash-ban, akkor miert nem ezt mondjak:
U.i.2: Es ti programozast tanultok??? :oops:
U.i.3: Ha valakinek van meg hazifeladata, csak nyugottan kerdezzen...
Nincs kedved megoldani az ELTÉn programozási környezet tárgyból feladott többi beadandótt is? Jó lenne. Nagyon le vagyunk égve.
Oda járunk, ez a megoldás is oda
kellett. Nekünk nem tudás kell, hanem diploma. Ne nevess, de ténjleg!
Kőszőnőm!
qqcinka
- A hozzászóláshoz be kell jelentkezni
[quote:16f1263899="szaszg"]U.i.: Ja, az elejen az alabbiaknak semmi ertelme:
[code:1:16f1263899]if [[ $len1 -eq 1 ]] && [[ $len2 -eq 1 ]]
then
echo $(($1 + $2))
exit
fi
[/code:1:16f1263899]
igy ezt nyugottan kikommentezheted (de megjobb, ha torlod :lol: )
Az igazi problema a carry vegso hozzaadasanak hianya volt :-)
Ha ezt kiszeded, akkor nem tud összeadni két egyjegyű számot, próbáld csak ki. Pedig sztem egy HF-nál ezt is ellenőrzik... (Hogy miért nem tudja összeadni, arra nem volt időm rájönni. Valamelyik seq a ludas a dologban.)
- A hozzászóláshoz be kell jelentkezni
Én is előálltam egy újabb megoldással. Ez tuti jól ad össze egy és több számjegyü számokat is.
[code:1:df5f254523]#!/bin/bash
len1=${#1}
len2=${#2}
num1=$1
num2=$2
if [[ len1 -lt len2 ]]
then
len1=$((len1 + 1))
for i in `seq $len1 $len2`
do
num1="0$num1"
done
fi
if [[ len2 -lt len1 ]]
then
len2=$((len2 + 1))
for i in `seq $len2 $len1`
do
num2="0$num2"
done
fi
len=$((${#num1} - 1))
carry=0
for i in `seq $len -1 0`
do
m1=${num1:$i:1}
m2=${num2:$i:1}
m3=$((m1 + m2 + carry))
mx=${m3:0-1}$mx
if [[ $m3 -gt 9 ]]
then
carry=1
else
carry=0
fi
done
if [[ carry -eq 1 ]]
then
mx="1$mx"
fi
echo "$1 + $2 = $mx" [/code:1:df5f254523]
Ui: Forrás Zsiraf 2004. Ápr 22. / 12:16-kor tett hozzászólása. Remélem a GPL elveket nem sértem... :wink:
- A hozzászóláshoz be kell jelentkezni
Kedves ifju programozo-titan-palantaim...
Szerintetek egyetlen Linux/UNIX oktato, vagy gyakvezer sem olvassa ezt a site-ot??
Szerintem, legalabb egy olvassa.
Ebben egesz biztos vagyok :)
Mint ahogy abban is biztos vagyok, hogy meg ma a tobbiek is elolvassak ezeket a bejegyzeseket.
- A hozzászóláshoz be kell jelentkezni
[quote:9c3ca66671="miq"]Kedves ifju programozo-titan-palantaim...
Szerintetek egyetlen Linux/UNIX oktato, vagy gyakvezer sem olvassa ezt a site-ot??
Szerintem, legalabb egy olvassa.
Ebben egesz biztos vagyok :)
Mint ahogy abban is biztos vagyok, hogy meg ma a tobbiek is elolvassak ezeket a bejegyzeseket.
lol
azert egyest ne adj :-) ertekeld a lelemenyesseguket :-)
- A hozzászóláshoz be kell jelentkezni
Nem az en dontesem, de feltetelezem, hogy ez a feladat ki sem lesz javitva.
Egyebkent, en nem szeretek sokat olvasni, ezert inkabb egy ilyen kis rovid megoldasnak orulok:
[code:1:27b393cd22]
A=$1;LA=${#A}
B=$2;LB=${#B}
if [ $LA -gt $LB ] ; then B=$(printf "%${LA}s" "$B"| tr " " 0) LC=$LA;
else A=$(printf "%${LB}s" "$A"| tr " " 0) LC=$LB;
fi
M=0
for ((i=$[LC-1];i>=0;i--)) ;do
S=$[${A:$i:1}+${B:$i:1}+$M]
C="$[S%10]$C"
M=$[S/10]
done
echo $M$C|sed "s/^0*//"
[/code:1:27b393cd22]
- A hozzászóláshoz be kell jelentkezni
[quote:505ee177ad="szaszg"]
U.i.: [code:1:505ee177ad]echo hi | (read a; echo $a)[/code:1:505ee177ad] Az, hogy a pipe-nal letrejon-e egy uj processz az hmm... hat anelkul, hogy futna egyszerre az echo hi es a read a ??? varom az otleteket....
pipe-olásnál természetesen fut mind a két processz
próbáld ki pl az lynx -dump-ot vmi ftps urllel, és utána greppeld
az fog egy ideig futni. másik konzolon lehet látni, hogy fut mind a 2
- A hozzászóláshoz be kell jelentkezni
Ha már tömör megoldás!
Én a
B=$(printf "%${LA}s" "$B"| tr " " 0) helyett
B=$(printf "%$0{LA}d" "$B") -t használnék.
Ráadásul gyorsabb is. :wink:
- A hozzászóláshoz be kell jelentkezni
[quote:0f5ad6a3a9="begin"]Ha már tömör megoldás!
Én a
B=$(printf "%${LA}s" "$B"| tr " " 0) helyett
B=$(printf "%$0{LA}d" "$B") -t használnék.
Ráadásul gyorsabb is. :wink:
Viszont nagy szamokra hibasan mukodik....
- A hozzászóláshoz be kell jelentkezni
Na most én kérek egy kis segítséget... :)
Egy folyamatot szeretnék kultúráltan leállítani.
A próba szkript a következő:
[code:1:8137aa5178]
echo $$ > /var/run/proba.pid
cat /dev/ttyS0 >> /tmp/valami.txt
[/code:1:8137aa5178]
Elindítom:
[code:1:8137aa5178]
sudo -b -u proba /usr/local/sbin/proba
[/code:1:8137aa5178]
A processzlitában így néz ki:
1884 pts/0 S 0:00 /bin/bash /usr/local/sbin/proba
1887 pts/0 S 0:00 \_ /bin/bash /usr/local/sbin/proba
1888 pts/0 S 0:00 \_ cat /dev/ttyS0
A problémám az hogy ha a pid-file -ban lévő ID
alapján próbálom leállítani a folyamatot akkor
csak a szülő áll le. A gyerek processz úgy marad.
Ha leállítom a legalsó folyamatot akkor rendesen
befelyeződik az egész.
De a gyerek processz azonosítóját addig nem tudom
biztosan amíg nem fut és így azt nem írhatom a pid
file-ba.
Próbáltam a start-stop-daemon programmal elintézni
a dolgot de az eredmény ugyanaz. Ha valaki csinált
már ilyet akkor adjon tanácsot hogyan lehet ezt
kultúráltan csinálni?
- A hozzászóláshoz be kell jelentkezni
&del inditsd es pidbe meg $!et tedd be
- A hozzászóláshoz be kell jelentkezni
Ebben biztos igazad van, nem próbáltam. :)
- A hozzászóláshoz be kell jelentkezni
:roll:
hogy szokták mondani
ja tényleg :wink:
szal, így néz ki most a script;
tar -zcvpf /var/backups/etc/etc-`date '+\%d-\%B-\%Y'`.tar.gz /etc
- A hozzászóláshoz be kell jelentkezni
[quote:cc509f2f50="maszili"]Próbáltam a start-stop-daemon programmal elintézni
a dolgot de az eredmény ugyanaz. Ha valaki csinált
már ilyet akkor adjon tanácsot hogyan lehet ezt
kultúráltan csinálni?
Kultúrálatlan megoldás: rekurzívan kilövöd egy adott PID alá tartozó processzeket, ps -ef felhasználásával. Előbb a gyerek, azután a megkapott processzid.
Vagy rekurzívan begyüjtöd az azonosítókat, és egyetlen kill parancs (ez szebb :))
Az elegáns a pstree -pl kimenetét feldolgozva lecsapni.
- A hozzászóláshoz be kell jelentkezni
[quote:3360eb28ed="looserKa"]nem megy:(
nem nézed meg és írod át nekem? :cry:
Bocs, de nem te jarsz progkorre? :)
- A hozzászóláshoz be kell jelentkezni
[quote:99d6135ed4="szaszg"]Kedves Zahy!
En nem azt mondtam, hogy a seq mindenhol letezik/standard unix util, csak azt, hogy nem Linux specifikus, mivel a GNU coreutils resze... Az, hogy a linux disztribek mind atveszik, es mondjuk a HP/Solaris/IBM nem, az nem tartozik a keredes lenyegehez...
Zsiraf
U.i.: [code:1:99d6135ed4]echo hi | (read a; echo $a)[/code:1:99d6135ed4] Az, hogy a pipe-nal letrejon-e egy uj processz az hmm... hat anelkul, hogy futna egyszerre az echo hi es a read a ??? varom az otleteket....
Hm:
int i[2]; pipe(&i[0]);
és most jön a trükk: pthread_create() :-)
A viccet félretéve a lényeg: a fenti csövet meg lehet csinálni úgy, hogy csak a cső bal oldalához hozunk létre egy új processzt, a jobb oldalán maga az eredeti shell fut, ekkor kapod a szokott eredményt, azaz, hogy visszakapod a értékét. És persze meg lehet csinálni úgy is, hogy a jobb oldalán hozunk létre új processzt (vagy pláne mind a két oldalon!), ekkor kapod a fenti eredményt, hisz a cső jobb oldalán levő processz hiába olvas be egy a változóba, azt a változót csak ő maga fogja látni. Arra, hogy a fent-meg-nem-nevezett shellben ezt hogy csinálták meg, már nem emlékszem.
Remélem, így már érthetőbb a fenti kissé elnagyolt utalásom a megvalósításokról.
Zahy
Ui: most hirtelen feltűnt, hogy itt van egy fölösleges zárójelpár. Nem nézem vissza, de szerintem én a read és echo köré nem írtam zárójelet, és pont ez a lényeg, hogy ha nincs zárójel, akkor hogyan működik! Legalábbis a man-ban, amiből vettem, nincs zárójel!
Ui2: és az, hogy valami a gnu-coreutils része, az gyakorlatban sajnos/nem-sajnos csak annyit jelent, hogy a Linux disztrók része, meg a majdan eccer megjelenő Hurd-é, máshol nem az a standard! (Ez kissé olyan, mintha mindig mindenki a GNU-specifikus dolgokat várná el egy C-fordítótól.)
- A hozzászóláshoz be kell jelentkezni
Ugyan ilyen feltételek mellet a szorzást, hogy lehet megoldani? :roll:
- A hozzászóláshoz be kell jelentkezni
[quote:63ce248394="vmiklos"]&del inditsd es pidbe meg $!et tedd be
Igazából egy kicsit bonyolultabb a helyzet. :)
[code:1:63ce248394]
cat $Port 2>>$LogFile | while read Line; do
echo "Itt lesz a sor feldolgozva: $Line"
done
[/code:1:63ce248394]
Valahogy a cat program processz ID-jet kellene a pid-file -ba
raknni... mert ha befejeződik a cat futása akkor szépen
be tud fejeződni a szkript is.
Hirtelen erre gondoltam:
[code:1:63ce248394]
cat $Port 2>>$LogFile | while read Line; do
[ -f $PidFile ] || pstree -pl | sed -n "/${0##*/}.\+.\+cat/ {s/.\+(\([0-9]\+\))$/\1/;P}" >$PidFile
echo "Itt lesz a sor feldolgozva: $Line"
done
[ -f $PidFile ] && rm $PidFile
[/code:1:63ce248394]
Nem túl nyakatekert ez így?
- A hozzászóláshoz be kell jelentkezni
[quote:ea7ce5a0a2="boobaa"][quote:ea7ce5a0a2="szaszg"]U.i.: Ja, az elejen az alabbiaknak semmi ertelme:
[code:1:ea7ce5a0a2]if [[ $len1 -eq 1 ]] && [[ $len2 -eq 1 ]]
then
echo $(($1 + $2))
exit
fi
[/code:1:ea7ce5a0a2]
igy ezt nyugottan kikommentezheted (de megjobb, ha torlod :lol: )
Az igazi problema a carry vegso hozzaadasanak hianya volt :-)
Ha ezt kiszeded, akkor nem tud összeadni két egyjegyű számot, próbáld csak ki. Pedig sztem egy HF-nál ezt is ellenőrzik... (Hogy miért nem tudja összeadni, arra nem volt időm rájönni. Valamelyik seq a ludas a dologban.)
Gondolod nem probaltam??
Zsiraf
U.i.: nalam gyonyoruen mukodik a seq 0 -1 0 is :-)
- A hozzászóláshoz be kell jelentkezni
A nem túl fényes érem egyik oldala: Sokan próbálnak diplomához jutni úgy, hogy a képességeik és/vagy a munkakedvük kevés hozzá.
A másik oldal: A HUP programozási fóruma szellemi koldusok és exhibicionisták találkahelye lett.
Előbbiek az "életrevalóbbak", az utóbbiak egy részét kiszorítják majd a munkahelyekről, a másik részét pedig (a megaláztatásra emlékezve) majd főnökként rúgják ki. Darwin pedig mosolyog.
lif
- A hozzászóláshoz be kell jelentkezni
[quote:aeb9eebd5f="miq"]Nem az en dontesem, de feltetelezem, hogy ez a feladat ki sem lesz javitva.
Egyebkent, en nem szeretek sokat olvasni, ezert inkabb egy ilyen kis rovid megoldasnak orulok:
[code:1:aeb9eebd5f]
A=$1;LA=${#A}
B=$2;LB=${#B}
if [ $LA -gt $LB ] ; then B=$(printf "%${LA}s" "$B"| tr " " 0) LC=$LA;
else A=$(printf "%${LB}s" "$A"| tr " " 0) LC=$LB;
fi
M=0
for ((i=$[LC-1];i>=0;i--)) ;do
S=$[${A:$i:1}+${B:$i:1}+$M]
C="$[S%10]$C"
M=$[S/10]
done
echo $M$C|sed "s/^0*//"
[/code:1:aeb9eebd5f]
Hat igen, a tr az bash parancs? ezen kivul a [ szinten kulso parancs, sot meg a sed is! (no jo, a seq is, de az viszonylag egyszeruen helyettesitheto, mig az elozo ketto NEM). S ha mar a sed ellen nincs kifogasunk, akkor a bc ellen miert van??
Zsiraf
U.i.: amugy szerintem elegansabb, a 18digit-es megoldas :-)
- A hozzászóláshoz be kell jelentkezni
nem értek én itt egy-két embert...én nem járok progmatra, (csak szeptembertől) de itt a legtöbb kérdésre én is tudtam válaszolni. miért gyötri valaki 4 évig magát egy olyan diplomával, amit nem szeret. ha meg szeret programozni, miért kérdezi meg, miért veszi el magától a megértés és megvilágosodás örömét?
- A hozzászóláshoz be kell jelentkezni
[quote:29956347dd="maszili"]
Ezt olvastad már? http://www.tldp.org/LDP/abs/html/
Szerintem a legjobb...
A problémádra konkrétan... http://www.tldp.org/LDP/abs/html/string-manipulation.html
Köszi, tényleg jó leírás.
- A hozzászóláshoz be kell jelentkezni
[quote:6f7bb3fa05="sfec"]Ugyan ilyen feltételek mellet a szorzást, hogy lehet megoldani? :roll:
Szoroztal mar eletedben papiron??? No, ugy, azaz ugyanigy, csak
az osszeadas helyett szorzas van, valamint a carry 2*N szamjegybol
fog allni...
Zsiraf
U.i.: amugy trey az a programozocsemete, aki nem talalja meg pl. a sed-ben megirt dc-t, es nem azzal szurja ki a szemet az ilyen HF-eket
felado feladoknak, az megerdemli a cekat... Foleg, ha nem tud egy egyszeru
papiron mar jol ismert algoritmust lekodolni :-( ...
- A hozzászóláshoz be kell jelentkezni
[quote:bf2e1ebc49="szaszg"]
Hat igen, a tr az bash parancs? ezen kivul a [ szinten kulso parancs, sot meg a sed is! (no jo, a seq is, de az viszonylag egyszeruen helyettesitheto, mig az elozo ketto NEM). S ha mar a sed ellen nincs kifogasunk, akkor a bc ellen miert van??
Azert, mert a targy shell programozasrol szol, es a bc parancsot hasznalva nem sokat mutatsz abbol, hogy esetleg le tudsz-e kodolni egy ciklust, ha kell...
Egyebkent, kicsit atgondolva, van meg rovidebb megoldas.
[code:1:bf2e1ebc49]
((L=${#1}>${#2}?${#1}:${#2}))
set - $(printf "%${L}s" "$1"| tr " " 0) $(printf "%${L}s" "$2"| tr " " 0)
M=0
while ((L--)); do
S=$[${1:L:1}+${2:L:1}+M]
C="$[S%10]$C"
M=$[S/10]
done
echo $M$C|sed "s/^0//"
[/code:1:bf2e1ebc49]
Tenyleg, nem csinalunk egy ki irja meg rovidebben versenyt? :)
- A hozzászóláshoz be kell jelentkezni
[quote:40698a4644="szaszg"]
Talan ez a script megteszi, habar az unbalanced "-nel az utolsot meghagyja...
[code:1:40698a4644]#n
/"/! s/ //gp
/"/ {
s/[ \t]\+"/"/
s/^/"\n/
:a
s/"/"\n/2
:b
s/\(\n.*\)[ \t]\+\([^ \t]*"\n\)/\1\2/
t b
s/"\n[^"]*$/&/
t c
s/\n//g
s/"//
s/"//
s/"/"\n/
b a
:c
s/\("\n.*\)[ \t]\+\([^ \t]*\)$/\1\2/
t c
s/\n//g
s/"//p
}
[/code:1:40698a4644] A futtatasa:
[code:1:40698a4644]sed -f xxx.sed allomanyod.txt[/code:1:40698a4644]
Zsiraf
U.i.: a #n az elejen a parancssori -n kapcsolot helyettesiti...
Koszi a segitseget!
Ha nem is tokeletes, otleteket mindenkepen adhat...
Meg egy kerdes.
En ugy olvastam a sed manualjaban, hogy a vezerlesatadas 't/T' akkor megy/nem megy
ha volt/nem volt beillesztes illetve az allomany megnyitasa ota volt/nem volt beillesztes.
Hogyan mukodhet egy vezerlesatadas, ha azt is figyelembe veszi, hogy az allomany
megnyitasa ota volt/nem volt beillesztes? Mert en emiatt nem tudtam megcsinalni.
Vagy rosszul ertettem valamit?
- A hozzászóláshoz be kell jelentkezni
Még egy kérdésem van - egyelőre. Hogyan lehet egy állományból azon sort, melynek egy vagy több szóköz karakterrel végződik, egy változóba hibátlanul, a szóköz karakterekkel együtt betenni?
Ha ezt írom:
[code:1:efc1df6f4b]
while read valtozo
echo $valtozo
done < egy_file
[/code:1:efc1df6f4b]
Levágja a sorokból a szóközöket.
- A hozzászóláshoz be kell jelentkezni
[quote:35d6b7f28b="maszili"]
Koszi a segitseget!
Ha nem is tokeletes, otleteket mindenkepen adhat...
Meg egy kerdes.
En ugy olvastam a sed manualjaban, hogy a vezerlesatadas 't/T' akkor megy/nem megy
ha volt/nem volt beillesztes illetve az allomany megnyitasa ota volt/nem volt beillesztes.
Hogyan mukodhet egy vezerlesatadas, ha azt is figyelembe veszi, hogy az allomany
megnyitasa ota volt/nem volt beillesztes? Mert en emiatt nem tudtam megcsinalni.
Vagy rosszul ertettem valamit?
Ezt az allomany megnyitasat hol olvastad?
[code:1:35d6b7f28b]info sed
...
`t LABEL'
Branch to LABEL only if there has been a successful `s'ubstitution
since the last input line was read or conditional branch was taken.
The LABEL may be omitted, in which case the next cycle is started.
...
`T LABEL'
Branch to LABEL only if there have been no successful
`s'ubstitutions since the last input line was read or conditional
branch was taken. The LABEL may be omitted, in which case the next
cycle is started.
[/code:1:35d6b7f28b]
...
Zsiraf
- A hozzászóláshoz be kell jelentkezni
[quote:4d489182c7="szucs_t"]
...egy változóba hibátlanul, a szóköz karakterekkel együtt betenni?
Használj idézőjeleket...
[code:1:4d489182c7]
while read valtozo
echo "$valtozo"
done < egy_file
[/code:1:4d489182c7]
- A hozzászóláshoz be kell jelentkezni
"Hali
Hogy tudnám rávenni a unixot, hogy nagyon nagy számokkal is dolgozzon. PL: 999999999999999999999999999999999999999999999999999999999999999999999999 + 1= ?
Köszi"
Enyhén progkör beadnadónak látszik a dolog, gyanítom ELTE-s vagy :) Gondolkozz abban, hogy két szám számjegyenként is összeadható :)
- A hozzászóláshoz be kell jelentkezni
"Enyhén progkör beadnadónak látszik a dolog, gyanítom ELTE-s vagy :)"
Szamit barmit is? Vegulis egy majdnem 3 eves postra valaszoltal :).
----
Sooner or later you had to talk, even if it was only because you'd run out of things to throw. - Pratchett
honlap készítés
- A hozzászóláshoz be kell jelentkezni