क्या इसमें अनुक्रमणिका का उल्लेख करना संभव है $@
? मुझे ग्रेकैट के विकी में कहीं भी निम्नलिखित की तरह उपयोग करने के लिए कोई संदर्भ नहीं मिल सकता है , और उन्नत स्क्रिप्टिंग गाइड और अन्य इसे संशोधित करने से पहले एक अलग चर पर असाइन करते हैं।
$ echo ${@[0]}
-bash: ${@[0]}: bad substitution
लक्ष्य DRY है : पहला तर्क एक चीज़ के लिए उपयोग किया जाता है, और बाकी किसी चीज़ के लिए, और मैं कोड को सामान्य करने, $@
सरणी को सामान्य बनाने या इस के लिए एक अलग फ़ंक्शन बनाने के लिए या तो डुप्लिकेट करने से बचना चाहूंगा (हालांकि इस पर) यह शायद सबसे आसान तरीका है)।
स्पष्टता: कोड को डीबग करना आसान बनाने के लिए ऑब्जेक्ट को चर-लंबाई के मूल्यों को संशोधित करना था । वर्तमान संस्करण मेरी पसंद के हिसाब से बहुत अधिक हैक है, हालाँकि यह विचित्र रास्तों के लिए भी काम करता है$@
$'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'
अद्यतन : ऐसा लगता है कि यह संभव नहीं है। कोड अब कोड और डेटा दोहराव दोनों का उपयोग करता है, लेकिन कम से कम यह काम करता है:
path_common()
{
# Get the deepest common path.
local common_path="$(echo -n "${1:-}x" | tr -s '/')"
common_path="${common_path%x}"
shift # $1 is obviously part of $1
local path
while [ -n "${1+defined}" ]
do
path="$(echo -n "${1}x" | tr -s '/')"
path="${path%x}"
if [[ "${path%/}/" = "${common_path%/}/"* ]]
then
shift
else
new_common_path="${common_path%/*}"
[ "$new_common_path" = "$common_path" ] && return 1 # Dead end
common_path="$new_common_path"
fi
done
printf %s "$common_path"
}
बाउंटी किसी को भी जाता है, जो कोड के दोहराव से छुटकारा पाने के लिए डुप्लिकेट स्लैश या डेटा के दोहराव को पकड़ सकता है $1
और अन्य मापदंडों, या दोनों को, कोड को एक उचित आकार रखते हुए और सभी यूनिट परीक्षणों को सफल करने के लिए:
test "$(path_common /a/b/c/d /a/b/e/f; echo x)" = /a/bx
test "$(path_common /long/names/foo /long/names/bar; echo x)" = /long/namesx
test "$(path_common / /a/b/c; echo x)" = /x
test "$(path_common a/b/c/d a/b/e/f ; echo x)" = a/bx
test "$(path_common ./a/b/c/d ./a/b/e/f; echo x)" = ./a/bx
test "$(path_common $'\n/\n/\n' $'\n/\n'; echo x)" = $'\n/\n'x
test "$(path_common --/-- --; echo x)" = '--x'
test "$(path_common '' ''; echo x)" = x
test "$(path_common /foo/bar ''; echo x)" = x
test "$(path_common /foo /fo; echo x)" = x
test "$(path_common $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n' $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'; echo x)" = $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'x
test "$(path_common /foo/bar //foo//bar//baz; echo x)" = /foo/barx
test "$(path_common foo foo; echo x)" = foox
test "$(path_common /fo /foo; echo x)" = x