Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: [Vyřešeno] Bash - List  (Přečteno 5802 krát)

Matesax

  • Host
[Vyřešeno] Bash - List
« kdy: 15 Dubna 2013, 08:00:12 »
Dobrý den,
můžu nějak použít array jako list? Podle všech možných totoriálů, wiki atd. by to mé fungovat mělo - ale nefunguje... :)

Kód: [Vybrat]
while read -r line
do
...
devices[$(($number - 1))] = "${line%:*}"
...
done < /tmp/devices.txt

Number incriminuje v každém kole. Číslo vydává správně - jelikož mi jej vypisuje error:

Kód: [Vybrat]
./install: 19: ./install: devices[@]: not found

Kde @ jsou jednotlivé hodnoty.
Jak to tedy správně udělat?
Děkuji.
« Poslední změna: 19 Dubna 2013, 15:25:34 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #1 kdy: 15 Dubna 2013, 09:41:07 »
Řekl bych, že především nepoužívat mezery kolem rovnítka, shell pak místo přiřazení do proměnné výraz zkouší spustit jako program a další znaky za mezerou bere jako argumenty.

Matesax

  • Host
Re:Bash - List
« Odpověď #2 kdy: 15 Dubna 2013, 11:22:41 »
To vím - toto je projev zoufalství... Když tam mezery nebyly, bral to jako string či co - v erroru byly závorky [] přilepeny k oné proměnné - poli. Zkoušel jsem 62589 kombinací - co na googlu najdete na prvních 6 stranách, to jsem již zkusil... :)

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Bash - List
« Odpověď #3 kdy: 15 Dubna 2013, 11:30:03 »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #4 kdy: 15 Dubna 2013, 11:59:57 »
Nevím, co jsi zkoušel, ale například tohle funguje:

Kód: [Vybrat]
#!/bin/bash
n=1
while read -r line
do
        devices[$(($n-1))]="${line%:*}"
        echo ${devices[$(($n-1))]}
        n=$(($n+1))
done < /tmp/devices.txt

Matesax

  • Host
Re:Bash - List
« Odpověď #5 kdy: 15 Dubna 2013, 13:42:14 »
http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Jsem zkoušel - slibně ale vypadá to od GdH...
Děkuji.

Matesax

  • Host
Re:Bash - List
« Odpověď #6 kdy: 15 Dubna 2013, 17:04:48 »
Kód: [Vybrat]
./install: 19: ./install: devices[0]: not found
1) /dev/sda1: UUID="f292a494-9f9f-471d-9e7e-d012596f17bd" TYPE="ext4"
./install: 19: ./install: devices[1]: not found
2) /dev/sda5: UUID="4cf54643-cd1e-4547-9ea2-6058613c7fcf" TYPE="ext4"
./install: 19: ./install: devices[2]: not found
3) /dev/sda6: UUID="0f9c79f2-0cb1-40a2-91d4-80d7adfe9bfd" TYPE="swap"
./install: 19: ./install: devices[3]: not found
4) /dev/sr0: LABEL="VOLUME IDENTIFIER" TYPE="udf"
./install: 19: ./install: devices[4]: not found
5) /dev/sdb: SEC_TYPE="msdos" LABEL="SMA-OP" TYPE="vfat"

To je pro:

Kód: [Vybrat]
devices[$(($number-1))] = "${line%:*}"

Mezera dle mého nehraje roli - jelikož inkriminace number mi funguje...

Kód: [Vybrat]
./install: 19: ./install: devices[0]=/dev/sda1: not found
1) /dev/sda1: UUID="f292a494-9f9f-471d-9e7e-d012596f17bd" TYPE="ext4"
./install: 19: ./install: devices[1]=/dev/sda5: not found
2) /dev/sda5: UUID="4cf54643-cd1e-4547-9ea2-6058613c7fcf" TYPE="ext4"
./install: 19: ./install: devices[2]=/dev/sda6: not found
3) /dev/sda6: UUID="0f9c79f2-0cb1-40a2-91d4-80d7adfe9bfd" TYPE="swap"
./install: 19: ./install: devices[3]=/dev/sr0: not found
4) /dev/sr0: LABEL="VOLUME IDENTIFIER" TYPE="udf"
./install: 19: ./install: devices[4]=/dev/sdb: not found
5) /dev/sdb: SEC_TYPE="msdos" LABEL="SMA-OP" TYPE="vfat"

To je pro:

Kód: [Vybrat]
devices[$(($number-1))]="${line%:*}"

A ještě dotaz - není v proc soubor se stejným obsahem jako je výpis blkid? Aktuálně totiž výstup blkid musím stejně ukládat do tmp - jelikož jej potřebuji číst řádek po řádku - a hádat se s cyklem aby bral string jako zdroj a ne jako cestu k souboru se mi nechce...

Abych to vysvětlil - potřebuji vypsat všechna zařízení tak, aby bylo uživateli jasné o jaké zařízení se jedná. A sice zařízení na které se dá instalovat OS - toto je totiž instalátor mého OS - SMA-OP. No a po vypsání všech zařízení na která by šlo instalovat OS si jedno z nich uživatel vybere číslem - abych z toho výpisu dostal jen cesty k zařízením potřebuji právě to pole - do kterého jen dosadím vstup uživatele jako index - pochopitelně s testem, zda se jedná o číslo...
« Poslední změna: 15 Dubna 2013, 17:14:07 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #7 kdy: 15 Dubna 2013, 20:16:09 »
Mezery samozřejmě roli hrají, to že to przníš někde jinde je jiná věc. Dej sem kousek konkrétního samostatně spustitelného kódu (podobně jako jsem to udělal já), který ti nefunguje a já ti řeknu proč. Ten jeden řádek, který tu ukazuješ nic neřekne. Spouštíš to opravdu v Bashi? sh != bash v Ubuntu, ani v Debianu, na to se taky mnoho lidí nachytá. Co má znamenat "inkriminace"?

Matesax

  • Host
Re:Bash - List
« Odpověď #8 kdy: 15 Dubna 2013, 21:03:59 »
Pouštím to v emulátoru - pro uživatelské pohodlí potřebuji aby to v něm jelo... Inkriminace je navýšení o 1, opakem je dekrementace - snížení o 1 - základní programátorský pojem... ++/--

http://slovnik-cizich-slov.abz.cz/web.php/slovo/dekrementace

Nefunguje mi ten konkrétní řádek - co víc bych měl poslat? Jestli si to chceš zkusit, je to v cyklu while...

Kód: [Vybrat]
#!/bin/sh

number=0

blkid > /tmp/devices.txt

while read -r line
do
number=$(($number + 1))
devices[$(($number-1))]="${line%:*}"

echo "${number}) ${line}"
done < /tmp/devices.txt
« Poslední změna: 15 Dubna 2013, 21:06:28 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #9 kdy: 15 Dubna 2013, 21:11:22 »
Zaprvé si inkriminaci pleteš s inkrementací a za druhé ukaž výpis
ls -l /bin/sh

Matesax

  • Host
Re:Bash - List
« Odpověď #10 kdy: 15 Dubna 2013, 21:22:19 »
Pro jistotu jsem použil:

Kód: [Vybrat]
dpkg-reconfigure bash

Výsledek stejný... Když jsem dal dash, tak to hodilo hlášku - bash ale nastaven již byl...

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #11 kdy: 15 Dubna 2013, 21:26:17 »
Proč používáš dash, když chceš použít bash? Kurnik zamysli se trochu ;)

Matesax

  • Host
Re:Bash - List
« Odpověď #12 kdy: 15 Dubna 2013, 21:43:13 »
Čti co píši - dal jsem ho jen na test... Bash mám jako defaultní a stejně to neřeší problém s arrayem - zápis je stejný... Alespoň co jsem naposledy používal dash.

Tedy:

Kód: [Vybrat]
ddd[index]=hodnota

Jenže to nejde... :)
« Poslední změna: 15 Dubna 2013, 21:45:46 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #13 kdy: 15 Dubna 2013, 21:46:37 »
Ten skript, co jsi dal spusť takto:

bash /cesta/ke/skriptu

Bash s tim problém nemá.

Matesax

  • Host
Re:Bash - List
« Odpověď #14 kdy: 15 Dubna 2013, 21:49:52 »
Kód: [Vybrat]
root@sam-eME642:/mnt/Data/SMA-OP# bash ./install
>>> Check for devices
./install: řádek 19: devices[0]: příkaz nenalezen
1) /dev/sda1: UUID="f292a494-9f9f-471d-9e7e-d012596f17bd" TYPE="ext4"
./install: řádek 19: devices[1]: příkaz nenalezen
2) /dev/sda5: UUID="4cf54643-cd1e-4547-9ea2-6058613c7fcf" TYPE="ext4"
./install: řádek 19: devices[2]: příkaz nenalezen
3) /dev/sda6: UUID="0f9c79f2-0cb1-40a2-91d4-80d7adfe9bfd" TYPE="swap"
./install: řádek 19: devices[3]: příkaz nenalezen
4) /dev/sr0: LABEL="VOLUME IDENTIFIER" TYPE="udf"
./install: řádek 19: devices[4]: příkaz nenalezen
5) /dev/sdb: SEC_TYPE="msdos" LABEL="SMA-OP" TYPE="vfat"

Tak jsem blbý já? :) Bože - proč jsou shelly tak blbě navrženy? Tedy proč to nemůže být normální C? Nechápu význam těch machinací...

EDIT:

Kód: [Vybrat]
#!/bin/bash

Konečně! :)

Ještě k tomu výpisu dostupných DriveDevices - je na to tedy nějaký pěkný soubor v proc?
Děkuji.
« Poslední změna: 15 Dubna 2013, 21:54:01 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #15 kdy: 15 Dubna 2013, 21:59:03 »
Za prvé - na první řádek skriptu se píše interpret - když chci použít bash, napíšu tam např. #!/bin/bash
Za druhé - první řádek s interpretem je ignorován, když skript spustíš rovnou v interpretu, jak jsem ti teď napsal
Za třetí - /bin/sh vždy ukazuje na systémový shell, ve kterém jsou všechny init skripty a měnit to bude jen sebevrah. V debianích systémech je to dash.
Za čtvrtý - pokud si v systému uděláš bordel, je to tvoje věc ;)

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Bash - List
« Odpověď #16 kdy: 15 Dubna 2013, 22:30:17 »
v bashi (a ne v bin/sh) me to vypisuje asi tohle - coz je spravne, ze:

Kód: [Vybrat]
# ./foo.sh
1) /dev/sda1: UUID="391ae98d-666f-4202-adea-8066cd425ece" TYPE="ext3"
2) /dev/sda2: UUID="3686b597-3941-47d1-9af1-5a9485812c3a" TYPE="swap"
3) /dev/sda5: UUID="ae5f539d-d7d2-4ac2-8fa7-1d9f4bb4dfd0" TYPE="ext4"
4) /dev/sda6: UUID="660875c3-59f1-4f5a-b5ed-9f091a025d7a" TYPE="ext4"

nicmene kdybych chtel tenhle vypis, tak udelam:

Kód: [Vybrat]
# blkid | cat -n - | perl -pe 's/^\s+(\d+)\s+/$1\) /'
1) /dev/sda1: UUID="391ae98d-666f-4202-adea-8066cd425ece" TYPE="ext3"
2) /dev/sda2: UUID="3686b597-3941-47d1-9af1-5a9485812c3a" TYPE="swap"
3) /dev/sda5: UUID="ae5f539d-d7d2-4ac2-8fa7-1d9f4bb4dfd0" TYPE="ext4"
4) /dev/sda6: UUID="660875c3-59f1-4f5a-b5ed-9f091a025d7a" TYPE="ext4"

pozor .. perl -pe !!je emulace sedu, akorat se tam pise normalni RE a nemusis to vsechno escapovat jako v sedu .. neni to zadna magie, ja sed skoro nepouzivam, ale bylo by to stejny
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Matesax

  • Host
Re:Bash - List
« Odpověď #17 kdy: 15 Dubna 2013, 22:35:07 »
Mě je samotný výpis k ničemu... Potřebuji hlavně cestu k zařízení - ostatek je pro uživatele... Pole mi stále nefunguje - sice to již nehlásí error, ale zařízení se nevybere...

Kód: [Vybrat]
while read -r line
do
number=$(($number + 1))
devices[$(($number-1))]="${line%:*}"

echo "${number}) ${line}"
done < /tmp/devices.txt

echo ">>> Select target device please (1-${number}):"

while true
do
read opt

if [[ $opt > 0 && $opt -le $number ]]
then
break
else
echo ">>> Bad input - try again..."
fi
done

device=$devices[$opt]

Navíc bych chtěl ten výpis co nejlidštější - aby i lajk mohl snadno poznat o jaké zařízení se jedná - pak jen zadá číslo a instalace proběhne sama... Ještě dodělám zápis do DVD a bude to komplet... :)

Aktuální stav:

Kód: [Vybrat]
root@sam-eME642:/mnt/Data/SMA-OP# ./install
>>> Checking for devices
1) /dev/sda1: UUID="f292a494-9f9f-471d-9e7e-d012596f17bd" TYPE="ext4"
2) /dev/sda5: UUID="4cf54643-cd1e-4547-9ea2-6058613c7fcf" TYPE="ext4"
3) /dev/sda6: UUID="0f9c79f2-0cb1-40a2-91d4-80d7adfe9bfd" TYPE="swap"
4) /dev/sr0: LABEL="VOLUME IDENTIFIER" TYPE="udf"
5) /dev/sdb: SEC_TYPE="msdos" LABEL="SMA-OP" TYPE="vfat"
>>> Select target device please (1-5):

Což mi pořád nepřijde dost lidské...
« Poslední změna: 15 Dubna 2013, 22:38:54 od Matesax »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Bash - List
« Odpověď #18 kdy: 15 Dubna 2013, 22:40:13 »
device=$devices[$opt]  >>  device=${devices[$opt]}

Matesax

  • Host
Re:Bash - List
« Odpověď #19 kdy: 15 Dubna 2013, 22:45:10 »
Jede to! Děkuji.
« Poslední změna: 15 Dubna 2013, 22:52:02 od Matesax »

Matesax

  • Host
Re:Bash - List
« Odpověď #20 kdy: 15 Dubna 2013, 22:57:15 »
Tak mám ještě jeden problémec. :) Na konci instalace ještě kopíruji externí programy (které jsou již hotové, aniž bych je v průběhu instalace kompiloval) a hned po tom kopírování umountovávám cílové zařízení. Jenže to se nezdaří, jelikož kopírování ještě probíhá. Sleep použít nechci - protože to je jen tipovačka... Dalo by se zařídit vyloženě počkání na dokopírování?
Děkuji.

Matesax

  • Host
Re:Bash - List
« Odpověď #21 kdy: 16 Dubna 2013, 07:09:54 »
Tak nakonec jsem si to udělal sám - ale nedaří se mi dostat velikost složky v čísle - jak na to jít?

Kód: [Vybrat]
originSUR=`du -sb "${path}/done"`
targetSUR=`du -sb "${path}/tmp"`

origin="${originSUR%${path}*}"
target="${targetSUR%${path}*}"

Jenže mezery bohužel ignorovány nejsou - jak tedy do {} dostat jako pattern mezeru? Převrácené lomítko a s nefunguje. A dalo by se to osekat bez mezikroku - rovnou z ``?
Děkuji.

jmp

  • Závislák
  • ****
  • Příspěvků: 2647
    • Zobrazit profil
Re:Bash - List
« Odpověď #22 kdy: 16 Dubna 2013, 07:41:05 »
cyklus se sleepem, dokud vysledek nasledujiciho nebude nula?
Kód: [Vybrat]
lsof $umisteni | wc -ljinak
Kód: [Vybrat]
man lsof
Kód: [Vybrat]
man wc

Matesax

  • Host
Re:Bash - List
« Odpověď #23 kdy: 16 Dubna 2013, 15:23:02 »
Kód: [Vybrat]
WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/sam/gvfs
Output information may be incomplete.

Mám to:

Kód: [Vybrat]
while [ $origin -ge $copied ]
do
$copied=$((`lsof tmp | wc -l` - target))
pct=$((100 * $copied / $files))

echo -en ".$pct%\b\b\b"
sleep 1
done

Matesax

  • Host
Re:Bash - List
« Odpověď #24 kdy: 16 Dubna 2013, 16:40:24 »
Kód: [Vybrat]
path=`pwd -P`

getDirSize()
{
ret=`sudo find "${path}/${1}" -printf "%s\n" | awk '{sum+=$1} END {printf "%d\n", sum}'`
}

getDirSize done

origin=$ret

getDirSize tmp

target=$ret

copied=0

cp done/* tmp

while [ $origin > $copied ]
do
getDirSize tmp
copied=$(($ret - $target))
pct=$((100 * $copied / $origin))

echo -en ".$pct%\b\b\b"
sleep 1
done

Toto se zasekne na 0 - proč?
Děkuji.

 


Provoz zaštiťuje spolek OpenAlt.