2012-08-17 4 views
7

Google ने अंत में मुझे असफल कर दिया है। मुझे लगता है कि बॉर्न शेल स्क्रिप्टिंग में यह कैसे करना है:

मैं एक परियोजना के लिए अपने सभी परीक्षणों को संभालने के लिए एक खोल स्क्रिप्ट लिख रहा हूं। मैंने प्रत्येक कार्य के लिए फ़ंक्शंस सेट अप किए हैं जो इस स्क्रिप्ट (बिल्ड, रन, क्लीन इत्यादि) कर सकते हैं, और वांछित फ़ंक्शन पर कोई अतिरिक्त कमांड लाइन पैरामीटर (कमांड के अलावा) को पास करना चाहते हैं।

उदाहरण:

./test.sh build -jbuild समारोह में -j पास करना चाहिए।

इस तर्क का एक छद्म कोड संस्करण देखने के लिए की तरह होगा:

function build() { 
    make $* 
} 

if [ $1 == 'build' ]; then 
    build $2 -> $N 
fi 

मैं यह कैसे पूरा कर सकते हैं?

उत्तर

9

मुझे लगता है कि आप shift कमांड का उपयोग कर इस प्रभाव को प्राप्त कर सकते हैं। यह एक ही स्थान पर नीचे स्थितीय मापदंडों के सभी कदम और $1 का मूल्य गिरता जाएगा (ताकि $3 का मूल्य $2 के लिए ले जाया जाता है, $2 का मूल्य $1 के लिए ले जाया जाता है और $1 का मूल्य खो दिया है)। एक बार ऐसा करने के बाद आप वास्तव में रुचि रखने वाले तर्कों की सूची चुनने के लिए [email protected] का उपयोग कर सकते हैं।

function build() { 
    echo "build with [email protected]" 
} 

echo "Starting args are [email protected]" 
cmd=$1 
shift 

if [ "$cmd" = 'build' ]; then 
    build "[email protected]" 
fi 
+1

आपको 'बिल्ड' के आमंत्रण में '$ @" का उपयोग करना चाहिए, लेकिन अन्यथा स्पॉट करें। –

5
function build() { 
    make "[email protected]" 
} 

if [ "$1" == 'build' ] 
then shift  # Lose $1 
    build "[email protected]" # Pass what was $2 .. $N 
fi 

नोट समारोह अपने आप में और समारोह के मंगलाचरण में "[email protected]" दोनों का उपयोग। मैं तर्क दूंगा कि डबल कोट्स या "$*" के बिना $* या [email protected] का उपयोग करने के लिए शायद ही कभी सही है; केवल "[email protected]" मूल तर्क सूची के अंतराल को संरक्षित करता है, जो महत्वपूर्ण है यदि आपके पास तर्क हैं जिनमें रिक्त स्थान हैं। यदि आप तर्कों को गूंजने जा रहे हैं, तो echo "The arguments: $*" उचित है। अन्यथा, 90% से अधिक समय, आप "[email protected]" का उपयोग करना बेहतर होगा। मैं परीक्षण ऑपरेटर में "$1" उद्धृत करने की दिशा में एक अत्यंत रूढ़िवादी दृष्टिकोण भी लेता हूं; उद्धरण छोड़ने के बारे में सावधान रहें।

यह भी देखें:

2

जब तक आप एक अधिक विस्तृत त्रुटि संदेश का उत्सर्जन के लिए इच्छुक हैं, स्पष्ट रूप से $1 परीक्षण करने के लिए कोई आवश्यकता नहीं है। बस कार्य करें:

#!/bin/sh -e 
function build() { 
    make "[email protected]" 
} 

"[email protected]" 

$1 तो नाम एक वैध समारोह है, यह के रूप में वांछित बुलाया जाएगा। यदि ऐसा नहीं होता है, तो आपको एक त्रुटि संदेश मिलेगा जो शायद आपके खोल के आधार पर बहुत बुरा नहीं है।

संबंधित मुद्दे