বর্ণমালার জন্য ASCII মান পেতে স্ক্রিপ্টটি বাশ করুন


48

আমি কীভাবে বর্ণমালার ASCII মান পেতে পারি?

উদাহরণস্বরূপ, 97জন্য a?

উত্তর:


69

এই দুটি ফাংশন (সাধারণত অন্যান্য ভাষায় উপলভ্য) সংজ্ঞা দিন:

chr() {
  [ "$1" -lt 256 ] || return 1
  printf "\\$(printf '%03o' "$1")"
}

ord() {
  LC_CTYPE=C printf '%d' "'$1"
}

ব্যবহার:

chr 65
A

ord A
65

7
@ dmsk80: +1। আমার মত যারা অন্যদের মনে করি তারা একটি টাইপো স্পট জন্য: "'A"পক্ষান্তরে যদি আপনি ব্যবহার সঠিক "A"এটা বলবেঃ A: invalid number। মনে হচ্ছে এটি প্রিন্টফের দিকে করা হয়েছে (অর্থাত্ শেলের মধ্যে, "'A"এটি আসলে ২ টি অক্ষর, ক 'এবং এ রয়েছে A। এগুলি প্রিন্টফের কাছে প্রেরণ করা হয়েছে And দশমিক ধন্যবাদ হিসাবে '%d''Ox%x'এটি হেক্সায় দেখানোর '0%o'জন্য বা এটি অক্টালটিতে ব্যবহার করার জন্য ব্যবহার করুন ))
অলিভিয়ার ডুলাক

3
-1 ব্যাখ্যা না করার জন্য কিভাবে এটি কাজ করে ... joking: ডি, কিন্তু গম্ভীরভাবে এসব কি printf "\\$(printf '%03o' "$1")", '%03o', LC_CTYPE=Cএবং একক উদ্ধৃতি "'$1"Do?
রাজ্জাক

1
সব পড়ুন প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী 71 বিশদ । একটি দুর্দান্ত বিস্তারিত বিশ্লেষণ।

19

আপনি সম্পূর্ণ সেটটি দেখতে পাবেন এর সাথে:

$ man ascii

আপনি অষ্টাল, হেক্স এবং দশমিক মধ্যে সারণী পাবেন।


ডিবিয়ান-ভিত্তিক ডিস্ট্রোসের জন্য একটি এসকি প্যাকেজও রয়েছে, তবে (কমপক্ষে এখন) প্রশ্নটিকে ব্যাশ হিসাবে ট্যাগ করা হয়েছে, সুতরাং এগুলি ওপিকে সহায়তা করবে না। আসলে, এটি আমার সিস্টেমে ইনস্টল করা আছে এবং আমি মানুষের কাছ থেকে যা পাই তা হ'ল এটির ম্যান পেজ।
জো

12

আপনি যদি এটি UTF-8 টি অক্ষরে প্রসারিত করতে চান:

$ perl -CA -le 'print ord shift' 😈
128520

$ perl -CS -le 'print chr shift' 128520
😈

সহ bash, kshবা zshবিল্টিনগুলি:

$ printf "\U$(printf %08x 128520)\n"
😈

আপনি কি বর্গক্ষেত্র বাক্স অক্ষর রাখার তাগিদে ছিলেন বা অন্যথায় তবে মূল চরটি পোস্টে প্রদর্শিত হচ্ছে না এবং একটি বর্গক্ষেত্রের অক্ষর দ্বারা প্রতিস্থাপন করা হচ্ছে।
mtk

1
@ এমটিকে, আপনার এমন একটি ব্রাউজার দরকার যা ইউটিএফ -8 এবং একটি ফন্টে 128520 অক্ষর প্রদর্শন করে।
স্টাফেন চ্যাজেলাস

আমি সর্বশেষ ক্রোমে রয়েছি, এবং এটি ইউটিএফ -8 সমর্থন করে না বলে মনে করবেন না। আপনি কি ব্রাউজারে আছেন তা জানতে চান?
mtk

@mtk, iceweaselউপর Debian sid। আইসউইজেলের ওয়েব কনসোল দ্বারা নিশ্চিত হওয়া ফন্টটি হ'ল "দেজাভু সানস" এবং আমার কাছে টিটিএফ-দেজাভু টিটিএফ-দেজাভু-কোর টিটিএফ-দেজাভু-অতিরিক্ত প্যাকেজ ইনস্টল করা আছে যা দেবান থেকে দেজভু- ফন্টস.আর.এস.এর উপরের
স্টাফেন

128520 এর বেস কি? আমার নিজের ctbl()সঠিকভাবে এটা প্রদর্শন করে, এবং একটি স্ট্রিংয়ের মাথা থেকে গৃহস্থালির কাজ যেভাবেই আমি যাতে সক্ষম বলে মনে হয় printf, কিন্তু এটা বন্ধ রাখে 4*((o1=360)>=(d1=240)|(o2=237)>=(d2=159)|(o3=230)>=(d3=152)|(o4=210)>=(d4=136))মধ্যে $OPTARGবাইট মানের জন্য।
মাইকজার্ভ

12

এটি ভাল কাজ করে,

echo "A" | tr -d "\n" | od -An -t uC

echo "A"                              ### Emit a character.
         | tr -d "\n"                 ### Remove the "newline" character.
                      | od -An -t uC  ### Use od (octal dump) to print:
                                      ### -An  means Address none
                                      ### -t  select a type
                                      ###  u  type is unsigned decimal.
                                      ###  C  of size (one) char.

ঠিক সমান:

echo -n "A" | od -An -tuC        ### Not all shells honor the '-n'.

3
আপনি কি একটি ছোট ব্যাখ্যা যোগ করতে পারেন?
বার্নহার্ড

tr ইনপুট থেকে "\ n" (নতুন লাইন) অপসারণ করতে। দশমিক অক্ষরে মুদ্রণ করার জন্য -d ডিসি ব্যবহৃত হয়।
সারাভানান

1
echo -nনতুন লাইনের প্রয়োজনীয়তা tr -d "\n"
অপসারণের

2
@ গৌতম, কেবলমাত্র কিছু বাস্তবায়নের সাথে echo, ইউনিক্সের সাথে সঙ্গতিপূর্ণ ইকোগুলিতে নয়। printf %s Aপোর্টেবল এক হবে।
স্টাফেন চেজেলাস

6

আমি সহজ (এবং মার্জিত?) বাশ সমাধানের জন্য যাচ্ছি:

for i in {a..z}; do echo $(printf "%s %d" "$i" "'$i"); done

কোনও স্ক্রিপ্টের জন্য আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

CharValue="A"
AscValue=`printf "%d" "'$CharValue"

CharValue এর আগে একক উদ্ধৃতি লক্ষ্য করুন। এটা বাধ্য ...


1
আপনার উত্তরটি কীভাবে DSsk80 এর উত্তর থেকে আলাদা?
বার্নহার্ড

1
আমার প্রশ্নের ব্যাখ্যাটি হ'ল "বর্ণমালার মানগুলির জন্য ASCII মানগুলি কীভাবে পাবেন"। কীভাবে কোনও চরিত্রের জন্য ASCII মান পুনরুদ্ধার করতে কোনও ফাংশন সংজ্ঞায়িত করবেন না। সুতরাং আমার প্রথম উত্তরটি বর্ণমালার জন্য ASCII মান পেতে একটি সংক্ষিপ্ত এক-লাইন কমান্ড।
ফুলস্টার্ট

আমি আপনার বক্তব্যটি পেয়েছি তবে আমি এখনও উভয় উত্তরের নীচের লাইনটি মনে করি printf "%d"
বার্নহার্ড

2
আমি সম্মত হই যে এই ফলাফলটি পাওয়ার প্রক্রিয়াটির একটি গুরুত্বপূর্ণ অংশ, তবুও আমি এই ধারণাটি করতে চাইনি যে এক্সপায়ারেট "আমার জন্য" এবং একটি ব্যাপ্তির ব্যবহার সম্পর্কে জানেন knew তিনি যদি একটি তালিকা চান, এটি একটি সত্যিকারের সময় বাঁচাতে পারে ;-)। এছাড়াও, ভবিষ্যতের পাঠকরা আমার সংযোজনগুলি সহায়ক বলে মনে করতে পারে।
ফুলস্টার্ট

6
ctbl()  for O                   in      0 1 2 3
        do  for o               in      0 1 2 3 4 5 6 7
                do for  _o      in      7 6 5 4 3 2 1 0
                        do      case    $((_o=(_o+=O*100+o*10)?_o:200)) in
                                (*00|*77) set   "${1:+ \"}\\$_o${1:-\"}";;
                                (140|42)  set   '\\'"\\$_o$1"           ;;
                                (*)       set   "\\$_o$1"               ;esac
                        done;   printf   "$1";   shift
                done
        done
eval '
ctbl(){
        ${1:+":"}       return "$((OPTARG=0))"
        set     "" ""   "${1%"${1#?}"}"
        for     c in    ${a+"a=$a"} ${b+"b=$b"} ${c+"c=$c"}\
                        ${LC_ALL+"LC_ALL=$LC_ALL"}
        do      while   case  $c in     (*\'\''*) ;; (*) ! \
                                 set "" "${c%%=*}='\''${c#*=}$1'\'' $2" "$3"
                        esac;do  set    "'"'\''\${c##*\'}"'$@";  c=${c%\'\''*}
        done;   done;   LC_ALL=C a=$3 c=;set "" "$2 OPTARG='\''${#a}*("
        while   [ 0 -ne "${#a}" ]
        do      case $a in      ([[:print:][:cntrl:]]*)
                        case    $a in   (['"$(printf \\1-\\77)"']*)
                                        b=0;;   (*)     b=1
                        esac;;  (['"$(  printf  \\200-\\277)"']*)
                                        b=2;;   (*)     b=3
                esac;    set    '"$(ctbl)"'     "$@"
                eval "   set    \"\${$((b+1))%"'\''"${a%"${a#?}"}"*}" "$6"'\''
                a=${a#?};set    "$((b=b*100+${#1}+${#1}/8*2)))" \
                                "$2(o$((c+=1))=$b)>=(d$c=$((0$b)))|"
        done;   eval "   unset   LC_ALL  a b c;${2%?})'\''"
        return  "$((${OPTARG%%\**}-1))"
}'

প্রথম ctbl()- সেখানে শীর্ষে - কেবল একবারে চালায়। এটি নিম্নলিখিত আউটপুট উত্পন্ন করে (যা sed -n lমুদ্রণযোগ্যতার জন্য ফিল্টার করা হয়েছে ) :

ctbl | sed -n l

 "\200\001\002\003\004\005\006\a\b\t$
\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\
\035\036\037 !\\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRS\
TUVWXYZ[\\]^_\\`abcdefghijklmnopqrstuvwxyz{|}~\177" "\200\201\202\203\
\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\
\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\
\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\
\267\270\271\272\273\274\275\276\277" "\300\301\302\303\304\305\306\
\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\
\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\
\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\
\372\373\374\375\376\377"$

... যা সমস্ত 8-বিট বাইট (কম NUL) , চারটি শেল-কোটেড স্ট্রিংগুলিতে 64৪-বাইট সীমানায় সমানভাবে বিভক্ত হয়। স্ট্রিং মত অকট্যাল রেঞ্জ সঙ্গে প্রতিনিধিত্ব করা যেতে পারে \200\1-\77, \100-\177, \200-\277, \300-\377, যেখানে বাইট 128 জন্য একটি জায়গা-ধারক হিসেবে ব্যবহার করা হয় NUL

ctbl()অস্তিত্বের জন্য প্রথমটির পুরো উদ্দেশ্যটি সেই স্ট্রিংগুলি তৈরি করা যাতে তার পরে আক্ষরিক এম্বেড থাকা তাদের সাথে evalদ্বিতীয় ctbl()ক্রিয়াকলাপটি সংজ্ঞায়িত করা যায়। সেভাবে তাদের ফাংশনে রেফারেন্স দেওয়া যেতে পারে যখনই প্রতিটি বার প্রয়োজন হয় তাদের আবার তৈরি করার প্রয়োজন নেই। evalদ্বিতীয় ctbl()ক্রিয়াটি কখন সংজ্ঞায়িত করে প্রথমটি থেমে যাবে।

দ্বিতীয় ctbl()ফাংশনের উপরের অর্ধেকটি এখানে বেশিরভাগ আনুষঙ্গিক - এটি কল করার সময় এটি যে কোনও বর্তমান শেল অবস্থাকে প্রভাবিত করতে পারে সেটিকে বহনযোগ্যভাবে এবং নিরাপদে সিরিয়ালাইজ করার জন্য ডিজাইন করা হয়েছে। উপরের লুপটি যে কোনও ভেরিয়েবলগুলি ব্যবহার করতে পারে তার মানগুলিতে যে কোনও উদ্ধৃতি উদ্ধৃত করবে এবং তার ফলাফলগুলি তার অবস্থানগত পরামিতিতে স্ট্যাক করবে।

প্রথম দুটি লাইন যদিও প্রথমে অবিলম্বে 0 ফিরে আসে এবং $OPTARGএকই হয়ে যায় যদি ফাংশনের প্রথম যুক্তিতে কমপক্ষে একটি অক্ষর না থাকে। এবং যদি এটি হয়, দ্বিতীয় লাইনটি তাত্ক্ষণিকভাবে তার প্রথম যুক্তিকে কেবল তার প্রথম চরিত্রের জন্য ছাঁটাই করে - কারণ ফাংশনটি কেবলমাত্র একটি সময়ে একটি অক্ষর পরিচালনা করে। গুরুত্বপূর্ণভাবে, এটি বর্তমান স্থানীয় প্রেক্ষাপটে এটি করে, যার অর্থ হ'ল যদি কোনও অক্ষর একক বাইটের চেয়ে বেশি সমন্বিত হতে পারে তবে শেলটি যদি সঠিকভাবে বহু-বাইট চরগুলি সমর্থন করে তবে এটি কোনও বাইটকে বাদ দেবে না এটির প্রথম যুক্তির প্রথম চরিত্র।

        ${1:+":"}       return "$((OPTARG=0))"
        set     "" ""   "${1%"${1#?}"}"

এটি যদি প্রয়োজন হয় তবে সেভ লুপটি করে এবং তারপরে এটি LC_ALLভেরিয়েবলকে বরাদ্দ করে প্রতিটি বিভাগের জন্য সি লোকালে বর্তমান লোকাল প্রসঙ্গে নতুন সংজ্ঞা দেয় । এই বিন্দু থেকে, একটি অক্ষর শুধুমাত্র একটি বাইট সমন্বয়ে গঠিত হতে পারে, এবং তাই যদি এর প্রথম যুক্তির প্রথম অক্ষরে একাধিক বাইট থাকে তবে এগুলি এখন প্রতিটি স্বতন্ত্র স্বতন্ত্র অক্ষর হিসাবে সম্বোধনযোগ্য হওয়া উচিত।

        LC_ALL=C

একারণে চালানোর ক্রমের বিপরীতে ফাংশনের দ্বিতীয়ার্ধটি while লুপ হয় এই কারণেই । বেশিরভাগ ক্ষেত্রে এটি সম্ভবত প্রতি কল প্রতি একবার সম্পাদিত হবে, তবে, যদি শেলটি ctbl()সঠিকভাবে সংজ্ঞায়িত করা হয় তবে বহু-বাইট অক্ষর পরিচালনা করে, এটি লুপ হতে পারে

        while   [ 0 -ne "${#a}" ]
        do      case $a in      ([[:print:][:cntrl:]]*)
                        case    $a in   (['"$(printf \\1-\\77)"']*)
                                        b=0;;   (*)     b=1
                        esac;;  (['"$(  printf  \\200-\\277)"']*)
                                        b=2;;   (*)     b=3
                esac;    set    '"$(ctbl)"'     "$@"

নোট করুন যে উপরের $(ctbl)কমান্ড প্রতিস্থাপনটি কেবল একবারই মূল্যায়ন করা হয় - evalযখন ফাংশনটি প্রাথমিকভাবে সংজ্ঞায়িত করা হয় - এবং সেই চিরকালের পরে টোকেনটি শেলটির স্মৃতিতে সংরক্ষিত হিসাবে সেই কমান্ড প্রতিস্থাপনের আক্ষরিক আউটপুট দ্বারা প্রতিস্থাপিত হয়। দুটি caseপ্যাটার্ন কমান্ড বিকল্পের ক্ষেত্রেও একই কথা । এই ফাংশনটি কখনও সাব-শেল বা অন্য কোনও কমান্ড কল করে না। এটি কখনই ইনপুট / আউটপুট পড়ার বা লেখার চেষ্টা করবে না (কিছু শেল ডায়াগনস্টিক বার্তার ক্ষেত্রে - যা সম্ভবত কোনও বাগ নির্দেশ করে)

এছাড়াও লক্ষ করুন যে লুপের ধারাবাহিকতার জন্য পরীক্ষাটি কেবল সহজ নয় [ -n "$a" ], কারণ আমার হতাশার কারণ হিসাবে আমি পেয়েছি যে কোনও কারণে bashশেল রয়েছে:

char=$(printf \\1)
[ -n "$char" ] || echo but it\'s not null\!

but it's not null!

... এবং তাই আমি $aপ্রতিটি পুনরাবৃত্তির জন্য স্পষ্টভাবে 0 এর লেনকে 0 এর সাথে তুলনা করি যা অনির্বচনীয়ভাবেও আলাদাভাবে আচরণ করে (পড়ুন: সঠিকভাবে)

caseচেক আমাদের চার স্ট্রিং এবং দোকানে বাইট এর সেট একটি রেফারেন্স কোন অন্তর্ভুক্তির জন্য প্রথম বাইট $b। এরপরে শেলের প্রথম চারটি অবস্থানগত পরামিতি setএম্বেড করা স্ট্রিংগুলিতে evalএবং ctbl()পূর্বসূরীর দ্বারা লিখিত হয় ।

এরপরে, প্রথম যুক্তির যা কিছু অবশিষ্ট রয়েছে তা অস্থায়ীভাবে তার প্রথম চরিত্রটিতে ছাঁটা হয়েছে - যা এখন একক বাইট হওয়ার আশ্বাস দেওয়া উচিত। এই প্রথম বাইট স্ট্রিং যা মিলেছে এবং রেফারেন্স লেজ থেকে স্ট্রিপ একটি রেফারেন্স হিসাবে ব্যবহার করা হয় $bহয় evalএকটি অবস্থানগত প্যারামিটার প্রতিনিধিত্ব করতে এসেছে তাই স্ট্রিং গত বাইট রেফারেন্স বাইট থেকে সবকিছু দূরে প্রতিস্থাপিত করা যেতে পারে 'ঘ। অন্যান্য তিনটি স্ট্রিং পুরোপুরি অবস্থানগত পরামিতিগুলি থেকে বাদ পড়েছে।

               eval "   set    \"\${$((b+1))%"'\''"${a%"${a#?}"}"*}" "$6"'\''
               a=${a#?};set    "$((b=b*100+${#1}+${#1}/8*2)))" \
                                "$2(o$((c+=1))=$b)>=(d$c=$((0$b)))|"

এই মুহুর্তে বাইটের মান (মডুলো 64) স্ট্রিংয়ের লেন হিসাবে উল্লেখ করা যেতে পারে:

str=$(printf '\200\1\2\3\4\5\6\7')
ref=$(printf \\4)
str=${str%"$ref"*}
echo "${#str}"

4

মানটির উপর ভিত্তি করে মডিউলাসের সাথে পুনরায় মিলনের জন্য একটি সামান্য গণিত করা হয় $b, প্রথম বাইটটি $aস্থায়ীভাবে দূরে সরিয়ে দেওয়া হয় এবং লুপ পুনর্ব্যবহারের পূর্বে বর্তমান চক্রের আউটপুট একটি স্ট্যাকের মুলতুবিতে সংযোজন করা হয় লুপের পুনর্ব্যবহারের আগে তা $aখালি কিনা তা যাচাই করার জন্য ।

    eval "   unset   LC_ALL  a b c;${2%?})'\''"
    return  "$((${OPTARG%%\**}-1))"

যখন $aবাদ দিয়ে - স্পষ্টভাবে খালি, সমস্ত নাম ও রাষ্ট্র $OPTARGযে ফাংশন তার মৃত্যুদন্ড অবশ্যই জুড়ে আক্রান্ত তা পূর্ববর্তী অবস্থায়ে পুনরুদ্ধার করা হয়েছে - - সেট এবং নাল না, সেট এবং নাল, বা সেট না কিনা - এবং আউটপুট সংরক্ষিত হয় থেকে $OPTARGফাংশনটি হিসাবে। প্রকৃত রিটার্ন মানটি তার প্রথম আর্গুমেন্টের প্রথম অক্ষরের মোট বাইটের তুলনায় একটাই কম - সুতরাং যে কোনও একক বাইট অক্ষর শূন্য ফিরে আসে এবং যে কোনও মাল্টি-বাইট চরটি শূন্যের চেয়ে বেশি ফিরে আসবে - এবং এর আউটপুট ফর্ম্যাটটি কিছুটা অদ্ভুত।

মান ctbl()সংরক্ষণ করে $OPTARGএকটি বৈধ শেল গাণিতিক এক্সপ্রেশন যে, যদি মূল্যায়ন, একই সময়ে ফর্মের পরিবর্তনশীল নামের সেট হবে $o1, $d1, $o2, $d2দশমিকে এবং তার প্রথম আর্গুমেন্ট প্রথম অক্ষরটি সমস্ত নিজ নিজ বাইটের অকট্যাল মান, কিন্তু শেষ পর্যন্ত মোট নির্ণয় করা এটির প্রথম যুক্তিতে বাইট সংখ্যা। এটি লেখার সময় আমার মনে একটি নির্দিষ্ট ধরণের ওয়ার্কফ্লো ছিল এবং আমি মনে করি সম্ভবত কোনও বিক্ষোভের ব্যবস্থা রয়েছে।

আমি প্রায়শই এর getoptsমতো স্ট্রিং আলাদা করার কারণ খুঁজে পাই :

str=some\ string OPTIND=1
while   getopts : na  -"$str"
do      printf %s\\n "$OPTARG"
done

s
o
m
e

s
t
r
i
n
g

আমি প্রতি লাইনে এটি কেবল ছাপার চেয়ে কিছুটা বেশি করছি, তবে কিছুই সম্ভব। যাই হোক, আমি না এখনো একটি পাওয়া getoptsসঠিকভাবে কি করতে হবে (ধর্মঘট যে - dash'র getoptsএটা গৃহস্থালির কাজ দ্বারা গৃহস্থালি, কিন্তু bashস্পষ্টভাবে না) :

str=ŐőŒœŔŕŖŗŘřŚśŜŝŞş  OPTIND=1
while   getopts : na  -"$str"
do      printf %s\\n "$OPTARG"
done|   od -tc

0000000 305  \n 220  \n 305  \n 221  \n 305  \n 222  \n 305  \n 223  \n
0000020 305  \n 224  \n 305  \n 225  \n 305  \n 226  \n 305  \n 227  \n
0000040 305  \n 230  \n 305  \n 231  \n 305  \n 232  \n 305  \n 233  \n
0000060 305  \n 234  \n 305  \n 235  \n 305  \n 236  \n 305  \n 237  \n
0000100

ঠিক আছে. তাই আমি চেষ্টা করেছিলাম ...

str=ŐőŒœŔŕŖŗŘřŚśŜŝŞş
while   [ 0 -ne "${#str}" ]
do      printf %c\\n "$str"    #identical results for %.1s
        str=${str#?}
done|   od -tc

#dash
0000000 305  \n 220  \n 305  \n 221  \n 305  \n 222  \n 305  \n 223  \n
0000020 305  \n 224  \n 305  \n 225  \n 305  \n 226  \n 305  \n 227  \n
0000040 305  \n 230  \n 305  \n 231  \n 305  \n 232  \n 305  \n 233  \n
0000060 305  \n 234  \n 305  \n 235  \n 305  \n 236  \n 305  \n 237  \n
0000100

#bash
0000000 305  \n 305  \n 305  \n 305  \n 305  \n 305  \n 305  \n 305  \n
*
0000040

এই জাতীয় ওয়ার্কফ্লো - বাইট / চরের ধরণের জন্য বাইট - এটি টিটি স্টাফ করার সময় আমি প্রায়শই প্রবেশ করি। ইনপুটটির শীর্ষ প্রান্তে আপনি চর মানগুলি পড়ার সাথে সাথে আপনার জানতে হবে এবং আপনার আকারগুলি (বিশেষত কলামগুলি গণনা করার সময়) প্রয়োজন এবং পুরো অক্ষর হওয়ার জন্য আপনার অক্ষর প্রয়োজন ।

এবং তাই এখন আমার আছে ctbl():

str=ŐőŒœŔŕŖŗŘřŚśŜŝŞş
while [ 0 -ne "${#str}" ]
do    ctbl "$str"
      printf "%.$(($OPTARG))s\t::\t$OPTARG\t::\t$?\t::\t\\$o1\\$o2\n" "$str"
      str=${str#?}
done

Ő   ::  2*((o1=305)>=(d1=197)|(o2=220)>=(d2=144))   ::  1   ::  Ő
ő   ::  2*((o1=305)>=(d1=197)|(o2=221)>=(d2=145))   ::  1   ::  ő
Œ   ::  2*((o1=305)>=(d1=197)|(o2=222)>=(d2=146))   ::  1   ::  Œ
œ   ::  2*((o1=305)>=(d1=197)|(o2=223)>=(d2=147))   ::  1   ::  œ
Ŕ   ::  2*((o1=305)>=(d1=197)|(o2=224)>=(d2=148))   ::  1   ::  Ŕ
ŕ   ::  2*((o1=305)>=(d1=197)|(o2=225)>=(d2=149))   ::  1   ::  ŕ
Ŗ   ::  2*((o1=305)>=(d1=197)|(o2=226)>=(d2=150))   ::  1   ::  Ŗ
ŗ   ::  2*((o1=305)>=(d1=197)|(o2=227)>=(d2=151))   ::  1   ::  ŗ
Ř   ::  2*((o1=305)>=(d1=197)|(o2=230)>=(d2=152))   ::  1   ::  Ř
ř   ::  2*((o1=305)>=(d1=197)|(o2=231)>=(d2=153))   ::  1   ::  ř
Ś   ::  2*((o1=305)>=(d1=197)|(o2=232)>=(d2=154))   ::  1   ::  Ś
ś   ::  2*((o1=305)>=(d1=197)|(o2=233)>=(d2=155))   ::  1   ::  ś
Ŝ   ::  2*((o1=305)>=(d1=197)|(o2=234)>=(d2=156))   ::  1   ::  Ŝ
ŝ   ::  2*((o1=305)>=(d1=197)|(o2=235)>=(d2=157))   ::  1   ::  ŝ
Ş   ::  2*((o1=305)>=(d1=197)|(o2=236)>=(d2=158))   ::  1   ::  Ş
ş   ::  2*((o1=305)>=(d1=197)|(o2=237)>=(d2=159))   ::  1   ::  ş

লক্ষ্য করুন ctbl()আসলে সংজ্ঞায়িত না $[od][12...]ভেরিয়েবল - এটা যে কোনো অবস্থায় যে কোনো দীর্ঘস্থায়ী প্রভাব কখনোই রয়েছে কিন্তু $OPTARG- কিন্তু শুধুমাত্র স্ট্রিং রাখে $OPTARGযে ব্যবহার করা যেতে পারে তাদের সংজ্ঞায়িত করতে - যা হল কিভাবে আমি প্রতিটি গৃহস্থালির কাজ দ্বিতীয় কপি পেতে করে উপরে printf "\\$o1\\$o2"কারণ আমি মূল্যায়ন প্রতিটি সময় তারা সেট করা হয় $(($OPTARG))। কিন্তু আমি আরো একটি ক্ষেত্র দৈর্ঘ্য পরিবর্তক করার ঘোষণা করছি যেখানে আমি এটা করতে printfএর %sস্ট্রিং যুক্তি ফরম্যাট, এবং কারণ অভিব্যক্তি সবসময় একটি অক্ষর বাইট মোট সংখ্যা মূল্যায়ণ, আমি যখন আমি কি আউটপুট উপর পুরো চরিত্র পাবেন:

printf %.2s "$str"

আপনার একটি অস্পষ্ট বাশ কোড প্রতিযোগিতায় অংশ নেওয়া উচিত!
হ্যালো গুডবাই

1
@ হেলো গুডবাই এই বাশ কোড নয় । বা এই নিরবচ্ছিন্ন হয় না। অস্পষ্টতা দেখতে, দয়া করে [ "$(printf \\1)" ]|| ! echo but its not null!ইতিমধ্যে উল্লেখ করুন , অর্থপূর্ণ মন্তব্য অনুশীলনের সাথে নিজেকে আরও ভালভাবে পরিচিত করতে নির্দ্বিধায় অনুভব করুন, যদি না আপনি এমন আসল প্রতিযোগিতার প্রস্তাব দেন ...?
মাইকজার্ভ

না, আমি তা করি না, আমি যা লিখেছি তা হ'ল এটির অন্য একটি উপায় যা আপনার কোডটি খুব বিভ্রান্তিকর (কমপক্ষে আমার কাছে), তবে সম্ভবত এটি সহজে বোধগম্য হওয়ার কথা ছিল না। যদি এটি বাশ না হয়, তবে এটি কোন ভাষা?
হ্যালো গুডবাই

@ হেলো গুডবি - এটি পসিএক্স shকমান্ড ভাষা। একই রকম bashএকটি বোর্ন আবার সুপারসেট, এবং বৃহত অংশে বহনযোগ্য বহনযোগ্য, স্ব প্রসারিতকরণ এবং নামধর্মীয় স্থানের যে কোনও ধরণের সম্মানজনক চরিত্রের আকারের জন্য উপরে বহন করা বেশিরভাগ যত্নের জন্য এক প্রিপিসিটাস প্রেরণা। bashইতিমধ্যে এর বেশিরভাগটি হ্যান্ডেল করা উচিত, তবে cভাষাটি printfছিল এবং সম্ভবত এটির উপরে প্রদত্ত সামর্থ্যের ঘাটতি রয়েছে।
মাইকজার্ভ

সরলতা ও পঠনযোগ্যতার স্বার্থে আমি এখনও প্রিন্টফ "% d" "'$ চর" ব্যবহার করতে আগ্রহী। আমি কৌতূহল করছি যে এটি আমাকে মাইকেজার্জের সমাধান ঠিকানাগুলিতে কী ধরণের সমস্যা প্রকাশ করে? রিটার্ন কোড (যা আমি বিশ্বাস করি উপরের মন্তব্যে তার বক্তব্য ছিল) প্রভাবিত করছে এমন কিছু নিয়ন্ত্রণ চরিত্রের চেয়ে বেশি কি আছে?
অ্যালেক্স জানসেন


2
  • প্রতীকটি নির্বাচন করুন, তারপরে CTRL + C টিপুন
  • খোলা konsole
  • এবং টাইপ করুন: xxd<press enter>
  • তারপরে টিপুন <SHIFT+INSERT><CTRL+D>

আপনি কিছু পেতে:

mariank@dd903c5n1 ~ $ xxd
û0000000: fb 

আপনি চেনেন যে চিহ্নটি আপনি পেস্ট করেছেন তাতে হেক্স কোড রয়েছে 0xfb

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.