ইনডেক্সগুলি উল্লেখ করা কি সম্ভব $@
? আমি গ্রেগেটের উইকিতে কোথাও নীচের মত ব্যবহারের জন্য কোনও রেফারেন্স খুঁজে পাচ্ছি না , এবং উন্নত স্ক্রিপ্টিং গাইড এবং অন্যরা পরিবর্তে পরিবর্তনের আগে এটিকে ভিন্ন ভেরিয়েবলের জন্য নির্ধারণ করে।
$ echo ${@[0]}
-bash: ${@[0]}: bad substitution
লক্ষ্যটি ডিআরওয়াই : প্রথম যুক্তিটি একটি জিনিসের জন্য ব্যবহার করা হয়, এবং বাকী অন্য কোনও কিছুর জন্য এবং আমি কোডটি স্বাভাবিক করার জন্য, $@
অ্যারে বা এর জন্য একটি পৃথক ফাংশন তৈরির অনুলিপি এড়াতে চাই (যদিও এই সময়ে এটি সম্ভবত সবচেয়ে সহজ উপায়) পয়েন্ট।
ব্যাখ্যা: বস্তুর মান পরিবর্তন করতে ছিল পরিবর্তনশীল দৈর্ঘ্যের $@
করতে কোড ডিবাগ করা আরো সহজ। বর্তমান সংস্করণটি আমার পছন্দ হিসাবে কিছুটা হ্যাকি, যদিও এটি এমনকি উদ্ভট পথগুলির জন্য এমনকি কাজ করে
$'--$`\! *@ \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