Bash
如何在這個小腳本中正確使用變數?
這是一個小腳本,用於重新定位我想要互動的舊錯誤符號連結。
#!/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}"
這避免了子流程的成本。