मूल विचार setएक सरणी से अनुक्रमित मूल्यों के साथ काम करने के अनुभव को फिर से बनाने के लिए उपयोग करना है। इसलिए जब आप किसी सरणी के साथ काम करना चाहते हैं, तो आप setमूल्यों के साथ चलते हैं; कि
set -- 1895 955 1104 691 1131 660 1145 570 1199 381
तो फिर तुम उपयोग कर सकते हैं $1, $2, forआदि दिए गए मूल्यों के साथ काम करने के लिए।
यदि आपको एक से अधिक सरणियों की आवश्यकता है, तो इसका अधिक उपयोग नहीं किया जा सकता है। यही कारण है कि जहां है saveऔर eval: चाल में आता है रिच के saveसमारोह ¹ वर्तमान स्थितीय मापदंडों संसाधित करता है और एक स्ट्रिंग आउटपुट उचित के हवाले से, है, जो तब के साथ इस्तेमाल किया जा सकता evalसंग्रहीत मूल्यों को बहाल करने की। इस प्रकार आप चलाते हैं
coords=$(save "$@")
वर्तमान कार्य सरणी को सहेजने के लिए coords, फिर एक नया सरणी बनाएं, उसके साथ काम करें, और जब आपको coordsफिर से काम करने की आवश्यकता हो , तो आप evalइसे करें:
eval "set -- $coords"
आपको जिस उदाहरण पर विचार करना है, उसे समझने के लिए आप यहाँ दो सरणियों के साथ काम कर रहे हैं, एक जो पहले से निर्धारित मानों के साथ है, और जिसे आप स्टोर करते हैं coords, और 1895, 955 इत्यादि वाले सरणी। स्निपेट स्वयं ही वह सब नहीं बनाता है। अपने आप समझ में, आप setऔर evalलाइनों के बीच कुछ प्रसंस्करण होगा । यदि आपको 1895, 955 के बाद में लौटने की आवश्यकता है, तो आप इसे पुनर्स्थापित करने से पहले सहेजेंगे coords:
newarray=$(save "$@")
eval "set -- $coords"
इस तरह आप $newarrayबाद में पुनर्स्थापित कर सकते हैं ।
As के रूप में परिभाषित किया गया
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
printf ... | sed ...बनामawk, हालांकि: मैं के सभी व्यावहारिक बारीकियों याद नहीं हैawkपोर्टेबिलिटी बनामsed, लेकिन यह निश्चित रूप से एक बड़ा सुरंग है। यदि लक्ष्य बस कड़ाई से POSIX है, तो यह ठीक हो सकता है, लेकिन यदि लक्ष्य आज व्यावहारिक उपयोग में सिस्टम के लिए व्यावहारिक पोर्टेबिलिटी है, तो यह नहीं हो सकता है।