मूल विचार 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 है, तो यह ठीक हो सकता है, लेकिन यदि लक्ष्य आज व्यावहारिक उपयोग में सिस्टम के लिए व्यावहारिक पोर्टेबिलिटी है, तो यह नहीं हो सकता है।