ডান তীর কী টিপছে তা সনাক্ত করতে ব্যাশস্ক্রিপ্ট


9

কীকোডটি ডান-তীর-কী না থাকলেও কেন এটি সর্বদা সত্য হিসাবে সনাক্ত করে?

stty_state=`stty -g`
stty raw; stty -echo
keycode=`dd bs=1 count=1 2>/dev/null`
stty "$stty_state"  

echo $keycode

if [ "$keycode"=39 ]; then
echo "Right Arrow Key Pressed!"
fi

উত্তর:


16

আপনি (সম্ভবত) দুটি + বাইটের মধ্যে প্রথম পড়েন। $keycodeতীর কী টিপে গেলে আপনার স্ক্রিপ্টে ESC হবে।

তীর কীগুলি হতে পারে:

\x1b + some value

শর্তাধীন অভিব্যক্তিতে ফাঁকা স্থানগুলির কারণে এটি সর্বদা সত্যের কাছে মূল্যায়ন করে।

সম্পাদনা করুন: যে বিবৃতিতে একটি আপডেট।

আপনার কমান্ডের ifপ্রস্থান স্থিতিতে পরিচালনা করে [[কমান্ড সমতূল্য test। এটি কমান্ডের সত্যতা একটি খুব গুরুত্বপূর্ণ সত্য। কমান্ড হিসাবে এটি আর্গুমেন্ট মধ্যে ফাঁক প্রয়োজন। [কমান্ড এটা প্রয়োজন যে আরও বিশেষ ]গত আর্গুমেন্ট হিসাবে।

[ EXPRESSION ]

কমান্ডটি এক্সপ্রেসন দ্বারা নির্ধারিত স্থিতি সহ প্রস্থান করে। 1 বা 0, সত্য বা মিথ্যা

প্রথম বন্ধনী লেখার জন্য এটি বিদেশি উপায় নয় । অন্য কথায় এটি সিনট্যাক্সের অংশ নয়if যেমন সিতে উদাহরণস্বরূপ:

if (x == 39)

দ্বারা:

if [ "$keycode"=39 ]; then

আপনি ইস্যু করুন:

[ "$keycode"=39 ]

যা প্রসারিত হয়

[ \x1b=39 ]

এখানে একটি যুক্তি \x1b=39হিসাবে পড়া হয় । যখন বা একটি আর্গুমেন্ট দেওয়া হয় কেবলমাত্র এক্সপ্রেসন শূন্য হলেই এটি মিথ্যা দিয়ে উপস্থিত হয় - যা কখনই হবে না। এমনকি খালি থাকলেও এর ফলাফল (যা নাল / ফাঁকা নয়)।test[$keycode=39

এটি দেখার আরেকটি উপায় আপনি বলেছেন:

if 0 ; then # When _command_ exit with 0.
if 1 ; then # When _command_ exit with 1.

আরও তথ্যের জন্য এই প্রশ্ন এবং উত্তরগুলি পড়ুন - পাশাপাশি [বনাম [[:

সে ক্ষেত্রে আপনি আবার টিক্স `` বনাম গবেষণাও করতে পারেন $( )


তীর কীগুলির সাথে একাধিকবার পালানোর ক্রম:

উপরে উল্লিখিত হিসাবে: আপনি (সম্ভবত) দুটি + বাইটের মধ্যে প্রথমে পড়েন। $keycodeতীর কী টিপে গেলে আপনার স্ক্রিপ্টে ESC হবে।

তীর এবং অন্যান্য বিশেষ কীগুলির ফলে সিস্টেমে প্রেরণের জন্য সিকোয়েন্স সিকোয়েন্স তৈরি হয়। চট্টগ্রাম সিটি কর্পোরেশন বাইট সংকেত দেয় যে "এখানে কিছু বাইট যা ভিন্নভাবে ব্যাখ্যা করা উচিত আসে" । নির্দেশক তীরচিহ্নগুলি যে হওয়া ASCII হবে হিসাবে [দ্বারা হওয়া ASCII অনুসৃত A, B, Cবা D

অন্য কথায় তীর কীগুলি নিয়ে কাজ করার সময় আপনাকে তিনটি বাইট পার্স করতে হবে।

আপনি এটি যাচাই করার জন্য দিকের দিক থেকে কিছু চেষ্টা করতে পারেন:

{   stty_state=$(stty -g)
    stty raw isig -echo
    keycode=$(dd bs=8 conv=sync count=1)
    stty "$stty_state"
} </dev/tty 2>/dev/null
printf %s "$keycode" | xxd

ফলন:

HEX        ASCII
1b 5b 41   .[A # Up arrow
1b 5b 42   .[B # Down arrow
1b 5b 43   .[C # Right arrow
1b 5b 44   .[D # Left arrow
 |  |  |
 |  |  +------ ASCII A, B, C and D
 |  +--------- ASCII [
 +------------ ASCII ESC

এটি কতটা পোর্টেবল তা নিশ্চিত নন, তবে তীর কীগুলি ধরার জন্য এর আগে কোডগুলি দিয়ে প্রায় খেলেছেন। qছাড়তে টিপুন :

while read -rsn1 ui; do
    case "$ui" in
    $'\x1b')    # Handle ESC sequence.
        # Flush read. We account for sequences for Fx keys as
        # well. 6 should suffice far more then enough.
        read -rsn1 -t 0.1 tmp
        if [[ "$tmp" == "[" ]]; then
            read -rsn1 -t 0.1 tmp
            case "$tmp" in
            "A") printf "Up\n";;
            "B") printf "Down\n";;
            "C") printf "Right\n";;
            "D") printf "Left\n";;
            esac
        fi
        # Flush "stdin" with 0.1  sec timeout.
        read -rsn5 -t 0.1
        ;;
    # Other one byte (char) cases. Here only quit.
    q) break;;
    esac
done

(ক নাবালক নোট হিসাবে আপনি আরো (মনস্থ) দশমিক 39 বিরুদ্ধে পরীক্ষা -। যা দশমিক এবং হেক্সাডেসিমেল মধ্যে একটি mixup মত দেখাচ্ছে এড়িয়ে যাওয়ার জন্য একটি ক্রম প্রথম বাইট ASCII মান চট্টগ্রাম সিটি কর্পোরেশন , যা দশমিক 27 এবং হেক্সাডেসিমেল 0x1b, যখন দশমিক 39 হেক্সাডেসিমেল হয় 0x27। )


2
প্রশ্নের প্রথম সমস্যাটি হ'ল =পরীক্ষায় চিহ্নটির চারপাশে কোনও ফাঁকা স্থান নেই , সুতরাং এটি খালি খালি স্ট্রিং হিসাবে কেবল পার্স করা হয়েছে এবং তাই এটি সত্য। তীর কীগুলি একাধিক বাইট হ'ল এ বিষয়টি পৃথক ইস্যু।
উর্টেল

2
হুম, সেই বাক্যটির তেমন প্রসঙ্গ নেই, আমি এটি পড়েছিলাম কারণ আমি ভেবেছিলাম যে এটি মাল্টি-বাইট ক্রমগুলির ব্যাখ্যাটির অংশ ছিল যা আমি ইতিমধ্যে জানতাম।
wurtel

2
@ উর্টেল: হ্যাঁ অস্পষ্ট আমি অনুমান। এটি একবার নির্ধারণ করে নিন যে [বিল্টিন কমান্ড লোকেরা বুঝতে পারে যে স্পেসগুলি আরও দ্রুত কেন গুরুত্বপূর্ণ। (বন্ধুত্বের পরিবর্তে বন্ধনী ব্যবহার করা বাশ করার কোনও অদ্ভুত উপায় নয়)) এখনই রান আউট করতে হবে। একবার ফিরে আপডেট।
user367890
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.