2009-01-17 118 views
8

這裏是我的腳本:Shell腳本波浪線擴展

#!/bin/bash 
echo "Digite o local em que deseja instalar o IGRAFU(pressione enter para 
instalar em 
${HOME}/IGRAFO):" 
read caminho 
if test -z $caminho 
then 
caminho="${HOME}/IGRAFO" 
fi 
echo "O IGRAFU será instalado no diretório: $caminho" 
mkdir -pv $caminho 

mv -v ./* $caminho 
echo "Pronto!" 

在「讀caminho」我可以接收來自用戶的喜歡〜/ somefolder的路徑。當腳本收到這樣的路徑時,mv和mkdir都不會進行代字符擴展,所以它會嘗試創建〜/ somefolder而不是/ home/username/somefolder,因此會失敗。

如何確保代字號將轉換爲HOME變量?

回答

14

您可能需要評估該變量是否正確替換。一個例子是簡單地做

caminho=`eval "echo $caminho"` 

請記住,這將打破,如果caminho包含分號或引號,它也會把反斜槓作爲逃避,如果數據是不可信的,你需要照顧你不是注射攻擊的目標。

希望有所幫助。

-1

如果不是/home,也許使用/home/${USER}替代高級用戶級別的目錄。

+3

假設所有用戶的主目錄有一個共同的父目錄是一個非常壞的假設。 – 2009-01-17 17:46:52

2

引用和擴展總是很棘手,特別是在bash中。 如果你自己的主目錄是不夠好,此代碼的工作(我測試):

if test -z $caminho 
then 
caminho="${HOME}/IGRAFO" 
else 
    case "$caminho" in 
    '~') caminho="$HOME" ;; 
    '~'/*) caminho="$HOME/${caminho#'~/'}" ;; 
    '~'*) echo "Case of '$caminho' is not implemented" 1>&2 ;; 
    esac 
fi