বাশের স্ক্রিপ্ট পরামিতি


103

আমি একটি শেল স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা এটির মতো ব্যবহার করা উচিত:

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

স্ক্রিপ্টটি পরে ocr চিত্র ফাইলটিকে একটি পাঠ্য ফাইলে রূপান্তর করবে। আমি এখন পর্যন্ত যা নিয়ে এলাম তা এখানে:

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

কিন্তু আমি পেতে কিভাবে জানি না -fromএবং -toমান। এটি কিভাবে করবেন সে সম্পর্কে কোনও ধারণা?


উত্তর:


124

যুক্তি হল যে আপনি একটি bashscript প্রদান ভেরিয়েবল উপস্থিত হবে $1এবং $2এবং $3যেখানে সংখ্যাকে যুক্তি বোঝায়। $0হ'ল আদেশ নিজেই।

আর্গুমেন্ট, স্পেস দ্বারা seperated হয় তাই আপনি যদি প্রদান করবে -fromএবং -toকমান্ডে, তারা এই ভেরিয়েবল খুব এত এই জন্য শেষ হয়ে যাবে:

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

তুমি পাবে:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

এটা তোলে বর্জন করা আরো সহজ হতে পারে -fromএবং -to, মত:

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

তারপরে আপনি পাবেন:

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

খারাপ দিকটি হ'ল আপনাকে এটি সঠিক ক্রমে সরবরাহ করতে হবে। এমন লাইব্রেরি রয়েছে যা কমান্ড লাইনে নাম যুক্তিগুলি পার্স করা সহজ করে তুলতে পারে, তবে সাধারণত শেল স্ক্রিপ্টগুলির জন্য আপনার কেবলমাত্র সহজ উপায়টি ব্যবহার করা উচিত, যদি এটি কোনও সমস্যা না হয়।

তারপরে আপনি এটি করতে পারেন:

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

$1এবং এর চারপাশে ডাবল কোটগুলি $2সর্বদা প্রয়োজনীয় হয় না তবে তাদের পরামর্শ দেওয়া হয়, কারণ আপনি যদি ডাবল উদ্ধৃতিগুলির মধ্যে না রাখেন তবে কিছু স্ট্রিং কাজ করবে না।


69

আপনি যদি নিজের বিকল্প নাম হিসাবে "থেকে" এবং "থেকে" ব্যবহারের সাথে পুরোপুরি সংযুক্ত না হন তবে গিওপটস ব্যবহার করে এটি প্রয়োগ করা মোটামুটি সহজ :

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts হ'ল একটি প্রোগ্রাম যা কমান্ড লাইন আর্গুমেন্টগুলি প্রসেস করে এবং স্বাচ্ছন্দ্যে আপনার জন্য তাদের পার্স করে।

f:t:নির্দিষ্ট করে যে আপনি 2 প্যারামিটারের প্রত্যাশা করছেন যা মান রয়েছে (কোলন দ্বারা নির্দেশিত)। এর মতো কিছু f:t:vবলে যে -vএটি কেবল একটি পতাকা হিসাবে ব্যাখ্যা করা হবে।

optsযেখানে বর্তমান প্যারামিটারটি সঞ্চিত আছে। caseবিবৃতি যেখানে আপনি এই প্রক্রিয়া হবে।

${OPTARG}প্যারামিটার নিম্নলিখিত মান রয়েছে। ${FROM_VAL}উদাহরণস্বরূপ মানটি পাবেন /home/kristoffer/test.pngযদি আপনি নিজের স্ক্রিপ্টটি চালিত করেন:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

অন্যরা যেমন পরামর্শ দিচ্ছে, যদি এটি আপনার প্রথমবারের মতো বাশ স্ক্রিপ্টগুলি লেখেন তবে আপনার কিছু বেসিকটি সত্যই পড়া উচিত। এটি কীভাবে getoptsকাজ করে তা সম্পর্কে একটি দ্রুত টিউটোরিয়াল ছিল ।


1
এটি একটি পঠনযোগ্য সমাধান বলে মনে হচ্ছে। আপনি কীভাবে দুটি পতাকা নির্দিষ্ট করবেন?
জেলফির কালটস্টল

@ জেলফির, আপনি পতাকাটির পরে কেবল ":" বাদ দিয়ে দুটি বা আরও বেশি পতাকা নির্দিষ্ট করতে পারেন can উদাহরণস্বরূপ f:t:vsহবে-f some_f -t some_t -v -s
h_s

34

ভেরিয়েবল ব্যবহার করুন "$1", "$2", "$3"এবং তাই এক্সেস আর্গুমেন্ট করতে। এগুলির সকলের অ্যাক্সেসের জন্য আপনি ব্যবহার করতে পারেন "$@", বা আর্গুমেন্টের গণনা পেতে $#(খুব কম বা খুব বেশি যুক্তি খুঁজে নেওয়ার জন্য দরকারী হতে পারে)।


24

আমার স্ক্রিপ্টগুলি সম্পূর্ণরূপে বিভিন্ন মেশিন, শেল এবং এমনকি সাইগউইন সংস্করণের মধ্যে বহনযোগ্য sure আরও, আমার সহকর্মীরা যারা আমার জন্য স্ক্রিপ্টগুলি লিখতে হয়েছিল, তারা প্রোগ্রামার, সুতরাং আমি এটি ব্যবহার করে শেষ করেছি:

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-s" ] 
    then ((i++)) 
        var1=${!i};

    elif [ ${!i} = "-log" ];
    then ((i++)) 
        logFile=${!i};  

    elif [ ${!i} = "-x" ];
    then ((i++)) 
        var2=${!i};    

    elif [ ${!i} = "-p" ]; 
    then ((i++)) 
        var3=${!i};

    elif [ ${!i} = "-b" ];
    then ((i++)) 
        var4=${!i};

    elif [ ${!i} = "-l" ];
    then ((i++)) 
        var5=${!i}; 

    elif [ ${!i} = "-a" ];
    then ((i++)) 
        var6=${!i};
    fi

done;

যুক্তি: আমি একটি launcher.shস্ক্রিপ্টও অন্তর্ভুক্ত করেছি, যেহেতু পুরো ক্রিয়াকলাপে বেশ কয়েকটি পদক্ষেপ ছিল যা একে অপরের তুলনায় স্বতন্ত্র ছিল (আমি "কোয়াসি" বলছি, যদিও প্রতিটি স্ক্রিপ্ট নিজেই চালানো যেতে পারে, তবে সাধারণত তারা সবাই একসাথে চালিত হত) ), এবং দু'দিনের মধ্যে আমি জানতে পেরেছি যে আমার প্রায় অর্ধেক সহকর্মী, প্রোগ্রামার এবং সমস্ত হয়ে লঞ্চার ফাইলটি ব্যবহার করতে, "ব্যবহার" অনুসরণ করতে বা হেল্পটি পড়া যা তারা যখনই কিছু করেছিল প্রতিবার প্রদর্শিত হবে তা খুব ভাল ছিল ভুল এবং তারা পুরো বিষয়টি নিয়ে গোলমাল করছে, ভুল ক্রমে যুক্তি সহ স্ক্রিপ্টগুলি চালাচ্ছিল এবং অভিযোগ করছে যে স্ক্রিপ্টগুলি সঠিকভাবে কাজ করে না। কোলেরিক হওয়ার কারণে আমি সিদ্ধান্ত নিয়েছি যে তারা আমার সহকর্মী-প্রমাণ কিনা তা নিশ্চিত করার জন্য আমার সমস্ত স্ক্রিপ্টগুলি পরীক্ষা করে ফেলবে। উপরের কোড বিভাগটি প্রথম জিনিস ছিল।


2
আমি এই পছন্দ। আমি শেষে একটি বিভাগ যুক্ত করছি - অন্যথায় প্রতিধ্বনি "অবৈধ যুক্তি: $ {! I i" ((i ++)) ফাই `
সিজেবিএস

6

ব্যাশে $1প্রথম আর্গুমেন্টটি স্ক্রিপ্টে পাস করা হয়, $2দ্বিতীয় এবং তেমন

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

সুতরাং আপনি ব্যবহার করতে পারেন:

./your_script.sh some_source_file.png destination_file.txt

ডাবল উদ্ধৃতিতে ব্যাখ্যা;

তিনটি স্ক্রিপ্ট বিবেচনা করুন:

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

এখন প্রার্থনা করুন:

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

আপনি যখন প্রার্থনা করেন foo.sh "a b"তখন এটি bar.sh a b(দুটি যুক্তি), এবং foo2.sh "a b"এটি দিয়ে bar.sh "a b"(1 টি যুক্তি) ডাকে । সর্বদা মনে রাখবেন কীভাবে প্যারামিটারগুলি পাস এবং ব্যাশে প্রসারিত হয়, এটি আপনাকে প্রচুর মাথা ব্যাথার হাত থেকে বাঁচায়।

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