- Mobil flották
- iPhone topik
- Vodafone mobilszolgáltatások
- Magisk
- Garmin Forerunner 255 Music - nem csak futóknak
- MG4 menetpróba
- Samsung Galaxy S22 és S22+ - a kis vagány meg a bátyja
- Redmi Note 12 Pro - nem tolták túl
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Samsung Galaxy A05s - az ötösért több kell
Hirdetés
-
Megjelenési dátumot kapott a Metaphor: ReFantazio
gp A tervek szerint a végső kiadás októberben lesz elérhető PC-re és konzolokra.
-
Bemutatkozott a Polestar Phone
ma Ami nem meglepő módon a Meizu utolsó készülékének átbrandelt verziója.
-
Musk szerint már jövőre itt vannak a Tesla Optimus humanoid robotok
it Musk a befektetőknek arról beszélt, hogy már az idei év végén gyárakban dolgozhatnak a Tesla Optimus robotok, a forgalmazás jövő év végén indulhat.
Új hozzászólás Aktív témák
-
Jester01
veterán
válasz passenger #41 üzenetére
Ennek millió módja van, íme egy lehetõség:
IFS=$'\n'
who | grep -F ''$*''
Magyarázat: a ''$*'' helyére a shell az IFS speciális változóval elválasztva összefûzi a parancssorban megadott argumentumokat. A grep pedig a -F opció hatására újsorral elválasztott konstans mintákat vár. Ha az IFS-t elõzõleg az újsor karakterre állítjuk, máris a kívánt eredményt kapjuk.Jester
-
Jester01
veterán
válasz passenger #44 üzenetére
Most nem azért, de szerintem kicsit alulbecsülte a feladatot aki ezt kitalálta. Ugyanis felelõtlenül használja a mondat kifejezést, hiszen a felsorolt írásjelek nem biztos, hogy új mondatot kezdenek, még akkor sem ha utánuk esetleg nagybetû jön. (Mi van akkor, ha II. Józsefrõl beszélek? Ezt ismerje fel nekem shell scriptbõl ha tudja )
Egyszerûsítésképpen vegyük azt az esetet, hogy sor nem kezdõdik írásjellel, és a felsorolt írásjelek bármennyi egymás utáni elõfordulása választja el a mondatokat.
Akkor az alábbi awk script talán mûködik:
BEGIN { FS=''[?!.]+''; }
{ mondatok += NF - 1; }
END { print mondatok; }Jester
-
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
-
Jester01
veterán
-
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
-
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
-
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
-
-
Jester01
veterán
sh az alap. A ksh és a bash is felülről kompatibilis vele. A bash és a ksh normál használatban elvileg felcserélhető. Állítólag a bash a 88as ksh továbbfejlesztése (mármint tudásában), ugyanakkor a 93as ksh viszont további újításokat tartalmaz.
Természetesen semmi akadálya annak, hogy basht tegyél a bsdre, ha tulajdonképpen ez a kérdés.Jester
-
Jester01
veterán
válasz loszerafin #143 üzenetére
Ugyanez bash shell script formájában:
for ((r=1; r<=8; r++))
do
for ((c=1; c<=8; c++))
do
if [[ $(( (r+c) % 2 )) == 0 ]]
then
TABLA[$((r * 8 + c))]='' ''
else
TABLA[$((r * 8 + c))]=''*''
fi
done
done
while read f c r
do
TABLA[$((r * 8 + c))]=''$f''
done
for ((r=1; r<=8; r++))
do
echo -n ''|''
for ((c=1; c<=8; c++))
do
echo -n ''${TABLA[r * 8 + c]}''
done
echo ''|''
done
Azt hiszem magától értetõdõ, leszámítva, hogy kevésbé olvasható.
Annyit fûznék még hozzá, hogy bash-ban nincs 2 dimenziós tömb (illetve asszociatív - az awk-ban ez van) ezért ki kellett lapítani egy dimenziósra a sakktáblát.Jester
-
Jester01
veterán
A 7es feladat egyetlen tr parancs, csak fel kell sorolni a leképezéseket.
tr ''abcdef .... xyzABCDEF ... XYZ'' ''nopqr ... klmNOPQR ... KLM''
(illetve ugyanez fordítva)
A 6/3 az bonyolult.
A 6/2 az ellenõrzés nélkül kb. ennyi:
x=$1
val=0
shift
while [ $# -gt 0 ]
do
val=$(( val * x + $1 ))
shift
done
echo $val
A 6/1 kb:
UCEN=$1
CH=${2:-28}
D=266
if jodatum ''$UCEN''
then
if [ $CH -lt 29 ]
then
D=$(( D + CH / 2 ))
else
D=$(( D + (CH*17)/30 ))
fi
date -d ''$UCEN + $D days'' +%Y-%m-%d
else
echo hiba
fiJester
-
Jester01
veterán
Én meg a #148-ban mutatott kóddal (persze az ütközést is ellenőrizve) betölteném egy tömbbe, és onnan az egész triviális.
Jester
-
Jester01
veterán
válasz Tele von Zsinór #192 üzenetére
Nekem kiválóan mûködik.
Ugyanakkor:
* A vagy operátort egy feltételen belül is használhatod:
if [[ ''$i'' -eq ''1'' || ''$i'' -eq ''3'' || ''$i'' -eq ''5'' || ''$i'' -eq ''7'' ]]
* Az eq az numerikus összehasonlítás, a számok köré felesleges az idézõjel.
* Az egészre sokkal egyszerûbb a párosságot vizsgálni:
if [[ $((i % 2)) -eq 1 ]]
then
feltolt_szokoz
else
feltolt_csillag
fi
* vagy vizsgálat nélkül:
for ((i=1; i<=7; i+=1))
do
feltolt_szokoz
i=$((i + 1))
feltolt_csillag
doneJester
-
Jester01
veterán
válasz Tele von Zsinór #193 üzenetére
> echo ''foo/bar'' | sed 's/\//\\/g'
foo\bar
Részletesen:
s: parancs
/: paraméter elválasztó
\/: védett per karakter
/: paraméter elválasztó
\\: védett backslash karakter
/: paraméter elválasztó
g: parancs módosító
Amúgy sima karaktercserére a tr parancs való, vagy a bash beépített operátora:
> t=''foo/bar''
> echo ${t//\//\\}
foo\barJester
-
Jester01
veterán
válasz Metalwarrior #196 üzenetére
Mondjuk soronként beolvasod a fájlt, majd a ${valtozo#minta} használatával megkeresed az összes elõfordulást.
Jester
-
Jester01
veterán
Például:
while read f a b c
do
if [ ''$f'' = ''OK'' ]
then
break
fi
echo ''<TR><TD>$f<TD>$a<TD>$b<TD>$c''
done
A $((a / 1024)) el fogja végezni az osztást, de a shell csak egész számokat ismer. Különben bc vagy dc:
echo ''<TR><TD>$f<TD>$(dc -e ''2 k $a 1024 / n'')<TD>$b<TD>$c''Jester
Új hozzászólás Aktív témák
- Bontatlan - BATTLEFIELD 1 Collectors Edition - Játékszoftver nélkül
- Microsoft licencek a legolcsóbban - UTALÁSSAL IS AUTOMATIKUS KÉZBESÍTÉS - Windows és Office
- Steam,EA,Epic és egyébb játékok Pc-re vagy XBox!
- Windows 10/11 Home/Pro , Office OEM/Retail kulcsok
- Windows 10 Home COA fizikai licencek kiárusítás ingyenes szállítással