változó átadása tömbnévnek

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.

Hozzászólások

Jól értem a kérdésed?
Pointereket/referenciákat szeretnél kezelni bash-ban?

$ a=15
$ var="a"
$ echo ${!var}
15

Ez kell?

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.

É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.

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

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

# 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?

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.