Puncte:0

Cum se separă diferite valori de date într-o listă și se atribuie variabilelor într-un script shell?

drapel ca

Să presupunem că am o listă de date într-un script shell ca aceasta:

DataList = ["
Pisică
Câine
Iepure
Porcușor de Guineea
Hamster
"]

Acum, cum aș proceda pentru a seta fiecare valoare de date separată din listă ca variabilă? Ca aceasta:

$Value0 = „Pisică”
$Valu1 = „Câine”
$Value2 = „Iepure”
$Value3 = "Cobai"
$Value4 = „Hamster”

Pentru înregistrare, sunt familiarizat cu utilitățile de linie de comandă precum Grep, AWK și SED. Cu toate acestea, nu sunt sigur de unde să încep cu așa ceva.

De asemenea, pentru înregistrare, shell-ul meu preferat este Fish, dar nu ezitați să răspundeți în format BASH sau SH. Nu-ți face griji, pot traduce.

Puncte:3
drapel ca

Nu sunt sigur de ce ai nevoie. ajuta asta?

#!/bin/bash
DataList=(
Pisică
Câine
Iepure
Porcușor de Guineea
Hamster
)

pentru i în {0..4}
do
    valoare[$i]=${DataList[$i]}
    echo „valoare[$i] = ${valoare[$i]}”
Terminat

iesiri:

valoare[0] = Cat
valoare[1] = Câine
valoare[2] = Iepure
valoare[3] = Cobai
valoare[4] = Hamster
MissBrae avatar
drapel ca
Nu, asta nu ajută. Căutam o modalitate de a analiza șirurile din listă și de a le adăuga la variabile separate. Am vrut să spun ce am scris la propriu. Nu am vrut să scot un șir aleator din listă.
NotTheDr01ds avatar
drapel vn
@MissBrae Pentru a fi corect, soluția de aici pare că ar trebui să fie ușor de extins la cazul tău de utilizare. Dacă aveți un număr fix de articole (ceea ce se pare că trebuie, dacă le analizați în variabile statice), atunci puteți urma cu ușurință exemplul lui @jpbrain cu `$mem0 = $value[0]; $mem1= $valoare[1]; etc`. Am înlocuit „valoare” cu „mem”, deoarece din alte comentarii, asta se pare că încercați să analizați.
Puncte:1
drapel vn

Deoarece cochilia dvs. preferată este Peștele, vă voi oferi trei opțiuni.

În primul rând, având în vedere DataList într-un format șir, puteți utiliza despicat coarda pentru a împărți liniile individuale într-o listă reală:

> setați DataList "
  Pisică
  Câine
  Iepure
  Porcușor de Guineea
  Hamster
  "

> set --show DataList

$DataList: stabilit în domeniul global, neexportat, cu 1 elemente
$DataList[1]: |\nPisică\nCâine\nIepure\nCobai\nHamster\n|

> setați valoarea (și împărțit -n \n „$DataList”)
> set --show Value

$Value: stabilit în domeniul global, neexportat, cu 5 elemente
$Value[1]: |Pisica|
$Value[2]: |Câine|
$Value[3]: |Iepure|
$Value[4]: |Cobai|
$Value[5]: |Hamster|

> echo $Value[2]

Câine

^ Liniile goale din exemplu sunt doar pentru lizibilitate și nu apar în rezultatul real

Dar dacă puteți, încorporați oricum datele ca o listă literală în script și evitați suplimentar despicat coarda:

> setați DataList „Cat” \
  "Câine" \
  "Iepure" \
  "Porcușor de Guineea" \
  "Hamster"

> set --show DataList

$DataList: setat în domeniul global, neexportat, cu 5 elemente
$DataList[1]: |Cat|
$DataList[2]: |Câine|
$DataList[3]: |Iepure|
$DataList[4]: |Cobai|
$DataList[5]: |Hamster|

> echo $DataList[2]
Câine

În cele din urmă, întrebarea dvs., luată literal, este să separați lista în variabile, mai degrabă decât o variabilă care conține o listă. Presupun că nu este într-adevăr ce ai vrut sa spui. Ar fi puțin patologic, IMHO, deoarece ați pierde capacitatea de a număra, repeta și indexa cu ușurință rezultatele, dar poate sa fi realizat ...

setați DataList "
Pisică
Câine
Iepure
Porcușor de Guineea
Hamster
"

set v (sir împărțit -n \n „$DataList”)

set script (pentru i în (seq (număr $v))
             echo 'set Value' (matematică $i-1) '"'$v[$i]'"'
           Sfârşit)

eval (unire șir ";" $scrpt)
set --erase v
set --erase srpt

Rezultate în:

$Value0 = „Pisică”
$Value1 = „Câine”
$Value2 = „Iepure”
$Value3 = "Cobai"
$Value4 = „Hamster”
MissBrae avatar
drapel ca
Mulțumiri! Ultima este exact ceea ce mi-am dorit! Poate că motivul pentru care am nevoie să fac asta ar explica de ce. Am creat un script shell pentru a afișa informații despre sistem, cum ar fi modelul procesorului, numărul de memorie, modelul plăcii de sistem, precum și versiunile de sistem de operare și kernel. Am vrut să adaug o modalitate de a afișa configurația exactă a memoriei, și nu doar cantitatea, viteza și numărul de module. De exemplu. Memorie: 16 GB (8 GB x 2). Am deja o funcție care parsează dmidecode și setează numărul de memorie ca $MemoryCount și numărul de module ca $ModulesInstalled și $TotalModules. Acum am de unde să încep.
MissBrae avatar
drapel ca
Ei bine... se pare că ar trebui să facă ceea ce mi-am dorit. Dar continui să primesc erori când încerc să-l rulez. Nu sunt atât de familiarizat cu buclele for din Fish, așa că nu l-am putut depana eu: ~/.local/ubin/test.fish (linia 13): Sfârșit neașteptat de șir, ghilimele nu sunt echilibrate set scrpt (pentru i în (seq (număr $v)) echo 'set Value''(matematica $i-1) '"'$v[$i]'"' Sfârşit) eval (unire șir ";" $scrpt) set --erase v scrpt ^ fish: Eroare la citirea fișierului /home/braelin/.local/ubin/test.fish
NotTheDr01ds avatar
drapel vn
@MissBrae Ah, da, dacă este vorba de analiza înregistrărilor, atunci are sens. Dar probabil mai bine să postezi ceva mai asemănător „datelor reale” pe care le folosești. Scenariul ar putea fi și mai simplu. Problema cu ghilimele a fost greșeala mea -- am rezolvat-o. Rețineți că Fish este suficient de drăguț pentru a evidenția citatul suplimentar (cel puțin linia) cu problema dacă îl inserați la prompt.
MissBrae avatar
drapel ca
Mulțumesc din nou, pentru remediere! Mi-am făcut propria editare... se pare că comanda „set --erase” așteaptă doar 1 argument și nu mai mult, așa că m-am separat în două rânduri. Acum funcționează așa cum este descris! Voi ține cont de asta, nu doar de întrebare. Poate că aș fi primit răspunsuri mai bune dacă aș spune problema mea reală. Acum... să mă apuc de a adăuga la sistemul meu scriptul de colectare a informațiilor!
NotTheDr01ds avatar
drapel vn
@MissBrae Se pare că „set --erase” cu mai multe valori este o ediție destul de recentă în Fish 3.2. Nu uitați să acceptați răspunsul -- Mulțumesc!
Puncte:0
drapel it

Aș păstra valorile într-o listă separată de două puncte și aș folosi „Funcțiile căii Bash” ale lui Stephen Collyer și taie -d: -f3 sau asemănător.

Iată blob-ul meu pre-scris:

Folosesc bash_path_funcs al lui Stephen Collyer, descris în Linux Journal încă din 2000:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/3768 https://www.linuxjournal.com/article/3935

The addpath funcția adaugă o intrare la o cale numai dacă aceasta nu este acolo în primul rând. delpath -n șterge toate directoarele inexistente dintr-o cale.

Puteți obține pathfunc.tgz dosar de la https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.