2009-01-17 15 views
8

यहाँ मेरी स्क्रिप्ट है। जब स्क्रिप्ट प्राप्त करता है तो एमवी और एमकेडीआईआर दोनों तरह के पथ को टिल्ड विस्तार नहीं करेंगे, इसलिए यह ~/somefolder और नहीं/home/username/somefolder बनाने की कोशिश करेगा और इसलिए विफल हो जाएगा।शैल स्क्रिप्ट टिल्ड विस्तार

मैं कैसे सुनिश्चित करूं कि टिल्ड को HOME चर में परिवर्तित किया जाएगा?

उत्तर

14

आपको संभवतः इसे प्रतिस्थापित करने के लिए चर को eval करने की आवश्यकता होगी। एक उदाहरण के लिए बस

caminho=`eval "echo $caminho"` 

ध्यान रखें कि यह अगर caminho अर्धविराम या उद्धरण शामिल टूट जाएगा करना होगा, यह भी बचने के रूप में बैकस्लैश व्यवहार करेंगे, और यदि डेटा अविश्वसनीय है, तो आप देखभाल करने के लिए की जरूरत है कि आप इंजेक्शन हमले का लक्ष्य नहीं है।

उम्मीद है कि मदद करता है।

-1

शायद /home/${USER} का उपयोग करें यदि आप /home नहीं हैं तो अपने उच्च उपयोगकर्ता स्तर निर्देशिका को प्रतिस्थापित कर सकते हैं।

+3

मान लिया जाये कि सभी उपयोगकर्ताओं घर निर्देशिका एक आम मूल निर्देशिका की बहुत बुरी धारणा है। –

2

उद्धरण और विस्तार हमेशा मुश्किल है, खासकर बाश में। तो अपने ही घर निर्देशिका काफी अच्छा है, इस कोड काम करता है (मैं इसे परीक्षण किया है):

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 
संबंधित मुद्दे