Nefunkční příkaz pro nahrazení řetězce

webhope

Nefunkční příkaz pro nahrazení řetězce
« kdy: 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


podlesh

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #1 kdy: 15. 03. 2010, 13:21:08 »
Uvnitř ${} už nemá být dolar, takže nějak takto:

Kód: [Vybrat]
${subdir//basic/drivers}

webhope

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #2 kdy: 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

Kit

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #3 kdy: 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".

Kit

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #4 kdy: 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;


webhope

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #5 kdy: 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?

Kit

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #6 kdy: 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.

webhope

Re: Nefunkční příkaz pro nahrazení řetězce
« Odpověď #7 kdy: 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