Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: webhope 15. 03. 2010, 11:36:07

Název: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: webhope 15. 03. 2010, 11:36:07
Zdravím,
nedaří se mi rozjet tenhle kód:
Kód: [Vybrat]
find_files=$(find $dir_backups/$disk_dir/$subdir -type f -name *.dd)
if [ "$find_files" == "" ]; then
  if [[ "$subdir" =~ "${basic}" ]]; then
    $subdir=${$subdir//basic/drivers}    # replace basic for drivers - bude hledat v druhém adresáři
  else if [[ "$subdir" =~ "${drivers}" ]]; then
    $subdir=${$subdir//drivers/basic}    # replace drivers for basic - bude hledat v druhém adresáři
       fi;
  fi;
fi;

A dává to hlášku:
řádek 301: $subdir=${$subdir//'basic'/'drivers'}: chybná substituce

Ve stringu $subdir se snažím zaměnit řetězec 'basic' za 'drivers'. Ovšem ani bez uvozovek, jak je to v návodu, to nefunguje.

A taky se chci zeptat, jestli ta struktura if není zbytečně složitá, protože mě připadá že je, a že ny to chtělo nějak zjednodušit.

Díky za radu
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: podlesh 15. 03. 2010, 13:21:08
Uvnitř ${} už nemá být dolar, takže nějak takto:

Kód: [Vybrat]
${subdir//basic/drivers}
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: webhope 15. 03. 2010, 15:48:30
Ještě ten script nejede jak by měl a souvisí to s tím find

Kód: [Vybrat]
find_files=$(find $dir_backups/$disk_dir/$subdir -type f -name *.dd -printf "%P\n")

echo $find_files
read;

if [ "$find_files" == "" ]; then

echo $find_files
read;

  if [[ "$subdir" =~ "${basic}" ]]; then
    subdir=${subdir//basic/drivers}    # replace basic for drivers - bude hledat v druhém adresáři
  else

if [[ "$subdir" =~ "${drivers}" ]]; then
    subdir=${subdir//drivers/basic}    # replace drivers for basic - bude hledat v druhém adresáři
       fi;
  fi;
fi;
echo $subdir
read;

Jde o to, že find nenalézá žádný soubor, což je správně, protože tam žádný soubor není. Problém je ale že mi to neprojde tou podmínkou:

if [ "$find_files" == "" ]; then

to asi znamená, že $find_files není tak docela prázdný řetězec. jak mám nadefinovat podmínku, aby to prošlo testem pokud nenajde řádný soubor? Díky
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: Kit 15. 03. 2010, 18:32:32
Kód: [Vybrat]
find_files=$(find "$dir_backups/$disk_dir/$subdir" -type f -name "*.dd" -printf "%P\n")
Chybí tam dva páry uvozovek. Po doplnění to může začít fungovat. Hlavně tam chybí uvozovky kolem "*.dd".
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: Kit 15. 03. 2010, 18:53:27
Snad jsem ty chyby vychytal:
Kód: [Vybrat]
find_files=$(find "$dir_backups/$disk_dir/$subdir" -type f -name "*.dd" -printf "%P\n")
if [ "$find_files" == "" ]; then
  if [[ "$subdir" =~ "basic" ]]; then
    subdir="${subdir//basic/drivers}"    # replace basic for drivers - bude hledat v druhém adresáři
  elif [[ "$subdir" =~ "drivers" ]]; then
    subdir="${subdir//drivers/basic}"    # replace drivers for basic - bude hledat v druhém adresáři
  fi;
fi;
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: webhope 15. 03. 2010, 22:02:32
Díky, jakmile se dostanu do linuxu tak to otestuju. Nicméně, proč tam ty uvozovky musí být?
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: Kit 15. 03. 2010, 23:42:28
Díky, jakmile se dostanu do linuxu tak to otestuju. Nicméně, proč tam ty uvozovky musí být?
Všude být nemusí, ale časem si zvykneš je dávat všude tam, kde by byť i jen teoreticky mohla vniknout jakákoli mezera nebo enter - třeba i v názvu souboru.

"*.dd" - uvozovky zabrání rozbalení "*" před spuštěním příkazu find.
Název: Re: Nefunkční příkaz pro nahrazení řetězce
Přispěvatel: webhope 16. 03. 2010, 12:34:49
Tak už jsem to vyzkoušel a to elif to je přesně to co jsem potřeboval, aby se to zjednodušilo. Díky