Como usar variáveis adequadamente neste pequeno script?

0

Aqui está um pequeno script para redirecionar links simbólicos errados que quero tornar interativos.

#!/bin/bash
# retarget (broken) symbolink links interactively

echo -n "Enter the source directory where symlinks path should be retargeted > " 
  read response1                                                                   
  if [ -n "$response1" ]; then                                                     
    symlinksdirectory=$response1                                                   
fi                                                                                 

if [ -d $symlinksdirectory ]; then                                                 
  echo -n "Okay, source directory exists. Now enter 1) the symlinks OLD-WRONG target directory > "
  read response2                                                                   
  if [ -n "$response2" ]; then                                                     
    oldtargetdir=$response2                                                        
  fi                                                                               

  echo -n "$oldtargetdir - And 2) enter the symlinks CORRECT target directory > "
  read response3                                                                   
  if [ -n "$response3" ]; then                                                     
    goodtargetdir=$response3                                                       
  fi                                                                               

  echo -n "Now parsing symlinks in $symlinksdirectory to retarget them from $oldtargetdir to $goodtargetdir > "
  find $symlinksdirectory -type l | while read nullsymlink ;
  do wrongpath=$(readlink "$nullsymlink") ;
  right=$(echo "$wrongpath" | sed s'|$oldtargetdir|$goodtargetdir|') ;
  ln -fs "$right" "$nullsymlink" ; done                                            
fi

Não substitui o caminho dos links simbólicos. Minha sintaxe ruim, pois funciona bem ao substituir variáveis por caminhos reais para sed (fim do script):

right=$(echo "$wrongpath" | sed s'|/mnt/docs/dir2|/mnt/docs/dir1/dir2|') ;

Como devo inserir as variáveis corretamente?

    
por tuk0z 10.02.2015 / 15:47

2 respostas

2

A resposta direta à sua pergunta é "use aspas duplas" porque aspas simples impedem todas as expansões:

 right=$(echo "$wrongpath" | sed "s|$oldtargetdir|$goodtargetdir|")

Não há necessidade do ponto e vírgula à direita; elas são necessárias apenas quando algo segue na mesma linha (então a anterior a done não é redundante, embora o layout seja pouco ortodoxo e o done geralmente esteja em uma linha por conta própria).

Você também pode usar:

right="${wrongpath/$oldtargetdir/$goodtargetdir}"

que evita a sobrecarga de subprocessos.

    
por 10.02.2015 / 16:06
2

As variáveis não são expandidas entre aspas simples, mas estão entre aspas duplas.

Além disso, você não precisa sed para uma substituição tão simples, você pode usar a expansão de parâmetro:

right=${wrongpath/$oldtargetdir/$goodtargetdir}
    
por 10.02.2015 / 16:06