মূলত যে কোনও শেল সহ:
printf '{ PS4=\${$(($#-$x))}; } 2>&3; 2>&1\n%.0s' |
x=LINENO+1 sh -sx "$@" 3>/dev/null
এবং আপনার সাব-শেলগুলি ব্যবহার করার দরকার নেই । উদাহরণ স্বরূপ:
set -x a b c
{ last= PS4=\${last:=\${$#}}; set +x; } 2>/dev/null
echo "$last"
... কপি করে প্রিন্ট ...
c
এবং এখানে একটি শেল ফাংশন যা আপনার জন্য একটি শেল সেট করতে পারে যা aliasআর্গুমেন্টগুলি সামনে বা পিছনে মুদ্রণ করবে:
tofro() case $1 in (*[!0-9]*|'') ! :;;(*) set "$1"
until [ "$1" -eq "$(($#-1))" ] &&
shift && alias args=":; printf \
\"%.\$((\$??\${#*}:0))s%.\$((!\$??\${#*}:0))s\n\" $* "
do [ "$#" -gt 1 ] &&
set "$@ \"\${$#}\" " '"${'"$((1+$1-$#))"'}"' ||
set "$1" '"$1" "${'"$1"'}"'
done; esac
এটি কোনও আর্গুমেন্টের জন্য আক্ষরিক মান সংরক্ষণ করার চেষ্টা করে না, বরং এটি এর মধ্যে একটি স্ট্রিং রাখে args alias:
:;printf "%.$(($??${#*}:0))s%.$((!$??${#*}:0))s\n" \
"$1" "${3}" "${2}" "${2}" "${3}" "${1}"
... এবং তাই কেবল পরামিতিগুলির পিছনে এবং সামনের দিকে রেফারেন্স সঞ্চয় করে। এটি একটি আর্গুমেন্ট হিসাবে দেওয়া হিসাবে এটি একটি গণনা পর্যন্ত সঞ্চয় করবে। এবং তাই উপরের aliasমত উত্পন্ন হয়েছিল:
tofro 3
printfপূর্ববর্তী কমান্ডের রিটার্ন মানের উপর ভিত্তি করে এর আচরণ প্রভাবিত হয় - যা সর্বদা :নাল আদেশ, এবং তাই সাধারণত সত্য। printfপ্রতিটি বার এটি প্রিন্ট করলে তার অর্ধেকটি আর্গুমেন্ট এড়িয়ে যাবে - যা ডিফল্টরূপে আর্গুমেন্টকে ক্ষুদ্রতম থেকে বৃহত্তর সংখ্যাতে মুদ্রণ করে আনে। তবে, আপনি যদি কেবল এটি করেন:
! args
... এটি তাদের বিপরীতে মুদ্রণ করে।
যেহেতু উপনামটি কোনও আক্ষরিক মান সংরক্ষণ করে না, প্রকৃত অর্গগুলি পরিবর্তিত হতে পারে তার মান স্থির থাকে তবে এটি এখনও যতটা প্রাসঙ্গিক হতে পারে তা উল্লেখ করবে। উদাহরণ স্বরূপ:
set one two three
tofro 3
args; ! args
shift; args; ! args
... যা ছাপায় ...
one
two
three
three
two
one
two
three
three
two
তবে উপন্যাসটি পুনরায় সেট করার কাজটি করা যেতে পারে:
tofro 2
args; ! args
... এবং তাই এটি প্রিন্ট ...
two
three
three
two
argতারা সঠিকভাবে অর্ডার করা হয়েছে এবং বিপরীতে নয় বলে আমি ব্যবহার করতে পারি না । এর ব্যবহারের ক্ষেত্রেexpr, আমি কেবলমাত্র মান ব্যবহার করতেই সীমাবদ্ধ।