Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: webhope 12. 08. 2013, 13:06:31

Název: Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 13:06:31
Zdravím,
je to už delší dobu co jsem v bashi nepsal žádný skript protože v linuxu skoro nedělám. Mám jeden script který se stará o zálohování a obnovování a toto je jeho část, kde se mají vypsat soubory v adresáři se zálohami. Po vybrání některého ze souborů, se potom tento použije jako zdroj nextsource v příkazu dd. Chtěl bych to upravit tak, že když zavolám ten script s jakýmkoliv parametrem, tak se tento parametr použije automaticky jako jiný adresář:
zalohy-oddilu.sh /mnt/media/cd-rom
Tedy soubory se zálohami se budou hledat na DVD. Takže se vypíše obsah toho DVD. Takže jen potřebuju provést kontrolu toho patametru a uložit tuto cestu do proměnné, dejmetomu mediapath=.... Pak tam vložit podmínku že když je nastavena proměnna mediapath tak se nastaví media path jako cesta místo
    nextsource=./$DISK_uppercase/$subdir/$FILE_NAME   # nebo relativne

Dík za pomoc, nechci to zvorat abych něco nezkazil


Kód: [Vybrat]
if [[ "$WORK" =~ "TEST" || "$WORK" =~ "RESTORE" ]]; then
    if [[ ! -n "$nexttarget" &&  "$WORK" =~ "RESTORE" ]]; then
      nexttarget="/dev/$oddil";

      ###################
      ##  VÝPIS ZÁLOH  ##
      ###################

      clear; echo -e "Vypis souboru zaloh disku $DISK, system $SYSTEM $WINDOWS. Vyber soubor.";
     echo "(Zapnutý filtr: $subdir)\n";
      listfiles "$dir_backups/$disk_dir/$subdir" "*.dd" gigabyte;
      PrintSelectedFile DiskBackup;

    DISK_uppercase=$(echo $DISK | tr '[:lower:]' '[:upper:]');  # takes [:lower:] TO [:upper:] reverse for upper to lower if needed   
    nextsource=$dir_backups/$DISK_uppercase/$subdir/$FILE_NAME  # absolutne
    nextsource=./$DISK_uppercase/$subdir/$FILE_NAME   # nebo relativne
# echo "ZAKONTROLUJ L597 nextsource: $nextsource"
# read
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: Cyberbobak 12. 08. 2013, 14:41:04
mediapath=$1
nextsource="./$DISK_uppercase/$subdir/$FILE_NAME"

[[ ! -z ${mediapath} ]] && nextsource=${mediapath}
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 14:57:25
Dík za pomoc,
mezitím jsem zjišťoval jak zjistit jestli daný disk obsahuje soubory se zálohami (mají koncovku dd), ještě mi to nejede, ale mohl by si to opravit, aby to
napsalo hlášku, že "disk je prázdný (nebo je nesprávná cesta)" pokud nebyl soubor nalezen? Asi by stačilo doplnit jeden z těch příkazů co si napsal místo "$media_path" != "" a mohlo by to jet, ne?

Kód: [Vybrat]
if [ "$media_path" != "" ]; then
  shopt -s nullglob dotglob
      files=("$media_path/*.dd")
      (( ${#files[*]} )) || echo directory is empty
      shopt -u nullglob dotglob
fi;
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 15:11:19
Proč vlastně proměnnou dáváš do špičatých závorek?

Kód: [Vybrat]
${mediapath}
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 15:15:06
Vždycky když úmysplně zadám nesprávnou cestu
Kód: [Vybrat]
if [[ ! -z ${mediapath} ]]; then
  shopt -s nullglob dotglob
      files=("$media_path/*.dd")
      (( ${#files[*]} )) || echo directory is empty
      shopt -u nullglob dotglob
fi;
tak mě to normálně pustí dál místo aby to vypsalo chybovou hlášku a ukončilo skript
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 15:36:59
Co dělám špatně, že to nefunguje?

[[ ! -z ${media_path} ]] && {
  shopt -s nullglob dotglob
      files=("$media_path/*.dd")
      (( ${#files
      shopt -u nullglob dotglob
}
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: Cyberbobak 12. 08. 2013, 15:51:30
Proč vlastně proměnnou dáváš do špičatých závorek?
- kvoli jednoznacnemu urceniu premennych, napriklad:

A="AAA"
B="BBB"
AB="AAABBB"

echo $AB - vypise AAABBB ale echo ${A}B - vypise AAAB

Ked neexistuje ani jeden subor ukonci skript:
ls ${files} 2>/dev/null  && echo Existuje || { echo Neexistuje; exit 1; }



Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 16:03:04
Ten příkaz mám dát místo těch dvou řádků?
Kód: [Vybrat]
(( ${#files[*]} )) || echo directory is empty
shopt -u nullglob dotglob

Protože tomu blobu taky vůbec nerozumím co to dělá a proč to tam je.
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 16:10:30
Takže to už konečně funguje (ta první část). Takže díky

Kód: [Vybrat]
[[ ! -z ${media_path} ]] && {
    files=("$media_path/*.dd")
     ls ${files} 2>/dev/null  && clear || { clear && echo Soubory *.dd na mediu nenalezeny; exit 1; }
 }
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 20:50:43
Pomohl by si mi ještě zkontrolovat tyhle dvě funkce (nebo kdokoliv jiný)?

Ve funkci change_path potřebuju načíst hodnotu z klávesnicového vstupu a vrátit ji jako výsledek funkce.
Ve funkci listfiles potrebuju proměnnou nastavit aby v ni byl ulozen vysledek funkce change_path
Takže radek  path=change_path; bych potreboval nahradit.

Kód: [Vybrat]
change_path(){ 
    old=$'IFS'; IFS=$'\n'
    echo -e '\E[1;37mVlož vlastní cestu k adresari, napr. /media/cdrom \E[1;0m';
    read -p $text;
    IFS=$old;

}

function listfiles()
{
old=$'IFS'; IFS=$'\n'
if [ "$3" == "byte" ]; then

    path=$1
    files=("$1/$2")
    ls ${files} 2>/dev/null  && clear || { clear && echo Soubory $2 na nenalezeny;  path=change_path; }
    list=$(find "$path" -type f -name "$2" -printf "%TH:%TM:%TS %Td.%Tm.%TY %s %P\n"| awk '{for (i=4;i <= NF;i++) printf("%s ",$i); print "\033[1;32m",int($3)" bytů","\033[1;36m",$2,"\033[1;0m",substr($1,1,8);}')

elif [ "$3" == "gigabyte" ]; then

    path=$1   
    files=("$1/$2")
    ls ${files} 2>/dev/null  && clear || { clear && echo Soubory $2 na nenalezeny;  change_path;}

    list=$(find "$path" -type f -name "$2" -printf "%TH:%TM:%TS %Td.%Tm.%TY %s %P\n"| awk '{for (i=4;i <= NF;i++) printf("%s ",$i); print "\033[1;32m",int($3/1000/1000/100)/10"GB","\033[1;36m",$2,"\033[1;0m",substr($1,1,8);}')

fi;
Název: Re:Potřebuju poradit se skriptem
Přispěvatel: webhope 12. 08. 2013, 22:13:41
Už to mám skoro hotové, ale ještě se mi nedaří správně nastavit cyklus while. Poradíte mi to dořešit?

Příklad volání funkce:

listfiles "$dir_backups/$disk_dir/mbr" *.img byte;
nebo
listfiles "$media_path" "*.dd" gigabyte;

Kód: [Vybrat]
change_path(){ 
    old=$'IFS'; IFS=$'\n'
    echo -e '\E[1;37mVlož vlastní cestu k adresari, napr. /media/cdrom \E[1;0m';
    read path;
    IFS=$old;
}

function listfiles()
{
old=$'IFS'; IFS=$'\n'; $result=0
if [ "$3" == "byte" ]; then
    path=$1   
    while [ "$result" != "0" ]; do
      files=("$path/$2")
      ls ${files} 2>/dev/null  && result=1 && clear || { clear && echo Soubory $2 nenalezeny;  change_path; }
    done
    list=$(find "$path" -type f -name "$2" -printf "%TH:%TM:%TS %Td.%Tm.%TY %s %P\n"| awk '{for (i=4;i <= NF;i++) printf("%s ",$i); print "\033[1;32m",int($3)" bytů","\033[1;36m",$2,"\033[1;0m",substr($1,1,8);}')
elif [ "$3" == "gigabyte" ]; then
    path=$1
    while [ "$result" != "0" ]; do
    files=("$path/$2")
    ls ${files} 2>/dev/null  && result=1 && clear || { clear && echo Soubory $2 na nenalezeny;  change_path;}
    done
    list=$(find "$path" -type f -name "$2" -printf "%TH:%TM:%TS %Td.%Tm.%TY %s %P\n"| awk '{for (i=4;i <= NF;i++) printf("%s ",$i); print "\033[1;32m",int($3/1000/1000/100)/10"GB","\033[1;36m",$2,"\033[1;0m",substr($1,1,8);}')
fi;

Když v předvoleném adresáři nejsou soubory nalezeny, vypíše požadavek na zadání vlastní cesty.
Když cesta není správná, má to znovu opakovat funkci change_path (ovšem děje se mi to, že se ten read znovu nespustí)
Pokud cesta je správná, provede výpis souborů z adresáře a vy si můžete vybrat který soubor chcete...

Takže jen tu smyčku opravit.