लागू करने का एक बेहतर तरीका क्या है print_last_arg
?
#!/bin/sh
print_last_arg () {
eval "echo \${$#}" # this hurts
}
print_last_arg foo bar baz
# baz
(यदि यह थे, कहते हैं, #!/usr/bin/zsh
के बजाय #!/bin/sh
मैं जानता हूँ कि चाहते हैं कि क्या करना है। मेरे समस्या के लिए यह लागू करने के लिए एक उचित तरीका खोजने है #!/bin/sh
।)
EDIT: उपरोक्त केवल एक मूर्खतापूर्ण उदाहरण है। मेरा लक्ष्य अंतिम तर्क को प्रिंट करना नहीं है , बल्कि एक शेल फ़ंक्शन के भीतर अंतिम तर्क को संदर्भित करने का एक तरीका है।
EDIT2: मैं इस तरह के अस्पष्ट शब्द के लिए माफी माँगता हूँ। मुझे इस बार ठीक होने की उम्मीद है।
यदि /bin/zsh
इसके बजाय /bin/sh
, मैं ऐसा कुछ लिख सकता था
#!/bin/zsh
print_last_arg () {
local last_arg=$argv[$#]
echo $last_arg
}
अभिव्यक्ति $argv[$#]
एक उदाहरण है जो मैंने अपने पहले EDIT में शेल फ़ंक्शन के अंतिम तर्क को संदर्भित करने के तरीके के रूप में वर्णित किया है ।
इसलिए, मुझे वास्तव में इस तरह अपना मूल उदाहरण लिखना चाहिए:
print_last_arg () {
local last_arg=$(eval "echo \${$#}") # but this hurts even more
echo $last_arg
}
... यह स्पष्ट करने के लिए कि जो मैं कर रहा हूं वह असाइनमेंट के दाईं ओर रखने के लिए एक कम भयानक बात है।
ध्यान दें, हालांकि, सभी उदाहरणों में, अंतिम तर्क को गैर-विनाशकारी रूप से एक्सेस किया जाता है । IOW, अंतिम तर्क की पहुंच से स्थिति संबंधी तर्क पूरे अप्रभावित रह जाते हैं।
var=$( eval echo \${$#})
करने के लिए eval var=\${$#}
- दो एक जैसे कुछ भी नहीं कर रहे हैं।
shift
और set -- ...
आधारित समाधान तब तक विनाशकारी हो सकते हैं जब तक कि उन कार्यों में उपयोग नहीं किया जाता है जहां वे हानिरहित हैं।
eval "var=\${$#}"
जब की तुलना में var=${arr[evaled index]}
, सिवाय इसके कि $#
एक गारंटीकृत सुरक्षित मूल्य है। पूरे सेट की नकल क्यों करें, इसे तब नष्ट करें जब आप इसे सीधे अनुक्रमित कर सकते हैं?