Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
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
-
mediapath=$1
nextsource="./$DISK_uppercase/$subdir/$FILE_NAME"
[[ ! -z ${mediapath} ]] && nextsource=${mediapath}
-
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?
if [ "$media_path" != "" ]; then
shopt -s nullglob dotglob
files=("$media_path/*.dd")
(( ${#files[*]} )) || echo directory is empty
shopt -u nullglob dotglob
fi;
-
Proč vlastně proměnnou dáváš do špičatých závorek?
${mediapath}
-
Vždycky když úmysplně zadám nesprávnou cestu
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
-
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
}
-
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; }
-
Ten příkaz mám dát místo těch dvou řádků?
(( ${#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.
-
Takže to už konečně funguje (ta první část). Takže díky
[[ ! -z ${media_path} ]] && {
files=("$media_path/*.dd")
ls ${files} 2>/dev/null && clear || { clear && echo Soubory *.dd na mediu nenalezeny; exit 1; }
}
-
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.
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;
-
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;
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.