Potřebuju poradit se skriptem

webhope

Potřebuju poradit se skriptem
« kdy: 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


Cyberbobak

Re:Potřebuju poradit se skriptem
« Odpověď #1 kdy: 12. 08. 2013, 14:41:04 »
mediapath=$1
nextsource="./$DISK_uppercase/$subdir/$FILE_NAME"

[[ ! -z ${mediapath} ]] && nextsource=${mediapath}

webhope

Re:Potřebuju poradit se skriptem
« Odpověď #2 kdy: 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;

webhope

Re:Potřebuju poradit se skriptem
« Odpověď #3 kdy: 12. 08. 2013, 15:11:19 »
Proč vlastně proměnnou dáváš do špičatých závorek?

Kód: [Vybrat]
${mediapath}

webhope

Re:Potřebuju poradit se skriptem
« Odpověď #4 kdy: 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


webhope

Re:Potřebuju poradit se skriptem
« Odpověď #5 kdy: 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
  • } )) || echo directory is empty

      shopt -u nullglob dotglob
}

Cyberbobak

Re:Potřebuju poradit se skriptem
« Odpověď #6 kdy: 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; }




webhope

Re:Potřebuju poradit se skriptem
« Odpověď #7 kdy: 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.

webhope

Re:Potřebuju poradit se skriptem
« Odpověď #8 kdy: 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; }
 }

webhope

Re:Potřebuju poradit se skriptem
« Odpověď #9 kdy: 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;

webhope

Re:Potřebuju poradit se skriptem
« Odpověď #10 kdy: 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.