Sziasztok!
Van egy mappam amiben szoveges fileok (szofajok nevei) tartalmaznak szavakat. Ezeket a szofajnevekkel ellatott tombokbe kiszervezem, majd megakarom hivni oket dinamikusan. Az a kerdesem, hogy valtozo neveket meglehet-e adni tombnevnek?
---------
A vonatkozo kodreszletek:
ftomb=($fajlok) #itt beteszek fileneveket egy tombbe
...
for ((i=0; i<${#ftomb[*]}; i++))
do
aktszofaj[i]=${ftomb[$i]}
aktszofajhossz[i]=$( cat ${ftomb[$i]} | wc -l )
for ((j=1; j<=${aktszofajhossz[$i]}; j++))
do
eval "akttombnev=${ftomb[$i]}"
eval $akttombnev[j]='$(sed -n $j"p" ${aktszofaj[i]})'
done
done
#az alabbi szofajnevvel ellatott tombokbe most megtalalhatoak a szavak (minden szo egy sor)
#pl. az echo ${igek[@]} -re helyes eredmenyt kapok
#kesobb viszont egy funkcio altal visszaadott parameterkent mar nemmukodik:
function randomszo() {
atomb=$2
echo ${igek[$((RANDOM%${#igek[@]}+1))]} #igy mukodik
echo ${atomb[$((RANDOM%${#atomb[@]}+1))]} #igy nem mukodik
echo $atomb[@] #igy sem mukodik
}
randomszo 1 igek
---------
Elnezest ha tul lamer a kerdes -.- Eval-al probalkoztam de szerintem az nem valo erre, az a sejtesem hogy itt valami szintaktikai dolog lehet a megoldas.
- 1522 megtekintés
Hozzászólások
- A hozzászóláshoz be kell jelentkezni
ezeket atolvastam (de lehet hogy akkor nemertettem)
- A hozzászóláshoz be kell jelentkezni
Jól értem a kérdésed?
Pointereket/referenciákat szeretnél kezelni bash-ban?
- A hozzászóláshoz be kell jelentkezni
tulajdonkeppen a funkcion beluli echo ${igek[$((RANDOM%${#igek[@]}+1))]} resznel az "igek" helyere szeretnek valtozot berakni
- A hozzászóláshoz be kell jelentkezni
hasznalj eval-t, ahogy az adatok betoltesekor is teszed
- A hozzászóláshoz be kell jelentkezni
$ a=15
$ var="a"
$ echo ${!var}
15
Ez kell?
- A hozzászóláshoz be kell jelentkezni
ez mukodik tomb eseten is? valamiert nemoke, nemtudok erteket adni egy tomb i-edik elemenek igy
- A hozzászóláshoz be kell jelentkezni
nos valoban, evallal nagyjabol igy tudtam "megoldani":
generaltelem='${'$2'[$((RANDOM%${#'$2'[@])+1))]}'
cmd='echo '$generaltelem
eval ${cmd}
csak az a gond, hogy a generalt elemet (vagy az indexet, esetleg a kigeneralt szamot) nemtudom visszanyerni (azert hogy ujra negeneralja ki, kiis akarom torolni a tombbol). Elobbutobb rajovok a megoldasra, ugyhogy koszonom, az eval lesz a megoldas valoszinuleg.
- A hozzászóláshoz be kell jelentkezni
Értem a problémát, ha
- ez egy házi feladat, vagy
- szeretnél elmélyedni a shell scriptek tudományában.
Ha viszont egy problémát szeretnél megoldani, akkor jobban jársz, ha választasz egy erre célra alkalmasabb programnyelvet, – ami akár egy script nyelv is lehet, – és azzal oldod meg a feladatot.
- A hozzászóláshoz be kell jelentkezni
az utobbi, most tanulom a scriptelgetest, pusztan csak erdekel
- A hozzászóláshoz be kell jelentkezni
eval helyett ${!nev} miért nem jó? Direkt arra való.
- A hozzászóláshoz be kell jelentkezni
azzal valamiert meg nem sikerult, de probalkozom. egyelore nem latom at a dolgot
- A hozzászóláshoz be kell jelentkezni
ezzel kuszkodok most.
a funkcion belulre az alabbit irtam:
x=$2 #elmeletileg a fuggveny masodik parameteret adja vissza, ami ezesetben a szofaj neve, pl. ige
var=$x[@] #igy kiirja az adott tomb osszes elemet
var=$x[i] #igy pedig, az adott tomb i-edik elemet
var=${#x[*]} # ennel kiirja, hogy 1 (pedig nem 1 a tomb elemeinek szama (?)
echo ${!var}
valahogyan szeretnem a tomb osszes parameteret elerni ha lehetseges, mert kikene belole generalnom veletlenszeruen egy elemet es azt kiis kell torolni belole
- A hozzászóláshoz be kell jelentkezni
Nem tudlak követni, de hátha segít: http://wiki.bash-hackers.org/syntax/arrays
--
Debian 8.9 Jessie, Android 6.0.1 Marshmallow+MIUI 8.5.7.0 Global, OpenWrt 15.05.1 Chaos Calmer, Armbian 5.24, Free MC Boot 1.953+OPL 0.10.15 Daily Build, Boyue C60 20140410 (Gentoo)
- A hozzászóláshoz be kell jelentkezni
Lehet nem jól értem a kérdést, de nem csak a tömböt szeretnéd feltölteni, hanem a tömb nevét is menet közben változtatni. Ilyet szerintem nem lehet, még pointerrel sem. Esetleg asszociatív tömbbel, de ahogy nézem, neked Pythonban kéne megoldás, ahhoz meg nem értek.
„Pár marék nerd-et leszámítva kutyát se érdekel már 2016-ban a Linux. Persze, a Schönherz koliban biztos lehet villogni vele, de el kéne fogadni, ez már egy teljesen halott platform. Hagyjuk meg szervergépnek…” Aron1988@PH Fórum
- A hozzászóláshoz be kell jelentkezni
de ahogy nézem, neked Pythonban kéne megoldás
shell scripttel erőlködik
- A hozzászóláshoz be kell jelentkezni
# Esetleg asszociatív tömbbel, de ahogy nézem, neked Pythonban kéne megoldás, ahhoz meg nem értek.
Láthatóan a shell-scripthez sem. (Már bocs.)
bash> declare -A lo=( [a]=b [c]=d )
bash> echo ${lo[a]}
b
bash> echo ${lo[c]}
d
bash> x=lo
bash> eval echo \${$x[c]}
d
bash> y=c
bash> eval echo \$[$x[$y]}
d
Mondjuk a szintaxis hányadék.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Valoban erolkodok, de szeretnem megtanulni a shell scriptelesst, fajkezelest, egyebeket. Igazabol ezesetben nemis a feladat a lenyeges, vagy az, hogy miben lenne a legoptimalisabb megoldani, pusztan csak gyakorlas.
Bemasolnam az egesz kodot ha nemgond, hatha ugy vilagosabb
#!/bin/bash
clear
#az adott mappaban (src) levo szoveges fileok tombbe rakasa
cd src
fajlok=$(ls)
ftomb=($fajlok)
#az adott fileok (szofajok) tartalmanak szofaj nevevel ellatott tombokbe rakasa
for ((i=0; i<${#ftomb[*]}; i++))
do
aktszofaj[i]=${ftomb[$i]}
aktszofajhossz[i]=$( cat ${ftomb[$i]} | wc -l )
for ((j=1; j<=${aktszofajhossz[$i]}; j++ ))
do
eval "akttombnev=${ftomb[$i]}"
eval $akttombnev[j]='$(sed -n $j"p" ${aktszofaj[i]})'
done
done
#szepen kilistazza a tombok tartalmat
echo "F.MN.IGENEVEK:" ${folyamatosmnin[@]}
echo "IGEK:" ${ige[@]}
echo "IGEKKOTOK:" ${igekoto[@]}
echo "INDULATSZAVAK:" ${indulat[@]}
echo "MELLEKNEVEK:" ${melleknev[@]}
echo "MUTATO NVMS:" ${mutatonm[@]}
echo "TARGYAK:" ${targy[@]}
echo "---------------------------------------------"
#veletlenszo generalasert felelos funkcio, termeszetesen hibas egyelore
function rszo() {
for ((i=0; i<$1; i++))
do
local -n arr=$2
echo ${arr[@]}
generaltszam=$((RANDOM%${#arr[@]}+0)) #generalunk egy szamot 1-tombmeret-ig
#egy kis 'debug' h lassam hogy mivan
echo "aktelem:" ${arr[$generaltszam]}
echo "gen:" $generaltszam #tomb generalt eleme
echo "max:" ${#arr[@]}
aktelem=${arr[$generaltszam]}
delete=($aktelem) #delete valtozonak atadjuk az elemet
arr=("${arr[@]/$delete}") #a generalt elemet kitoroljuk a tombbol <- sajna egyelore hibas
echo "----------------"
done
}
rszo 14 targy
Hat nagyjabol ennyi. Tulajdonkeppen az "rszo" funkcion belul szeretnek tudni hivatkozni az adott parameterben megadott tombnevre. Ha jolsejtem, a "local -n arr=$2" sor ezt megis oldotta, igy a "echo ${arr[@]}" peldaul mukodik is, szerintem ezt a reszet mar a segitsegetekkel sikerult megoldani. Most mar csak ugy kene tudnom torolni a tombbol, hogy peldaul ha a torlendo szo az, hogy "mű" akkor a "műanyag" "műszőrme" szavak a torles utan ne igy nezzenek ki -> "anyag" "szőrme".
Szerintem ezt mar kitudom keresgelni, csak gondoltam beteszem a teljes kodot. Koszonom a segitsegeket sracok.
- A hozzászóláshoz be kell jelentkezni