Bash

如何在這個小腳本中正確使用變數?

  • February 10, 2015

這是一個小腳本,用於重新定位我想要互動的舊錯誤符號連結。

#!/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

它不會替換符號連結的路徑。sed我的語法不好,因為它在用(腳本結尾)的真實路徑替換變數時效果很好:

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

我應該如何正確插入變數?

您問題的直接答案是“使用雙引號”,因為單引號會阻止所有擴展:

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

不需要尾隨分號;僅當某些內容在同一行上時才需要它們(因此之前done的不是多餘的,儘管佈局是非正統的,並且done通常應該單獨在一行上)。

您還可以使用:

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

這避免了子流程的成本。

引用自:https://unix.stackexchange.com/questions/184038