Position @ থেকে কোনও অবস্থানগত প্যারামিটার কীভাবে সরাবেন


13

মূলত, আমি -infপ্যারামিটার তালিকা থেকে প্রথম ঘটনাটি "টেনে আনা" করতে চাই । (বাকি পরামিতিগুলি একটি পৃথক কমান্ডের সাথে প্রেরণ করা হবে))

আমার স্ক্রিপ্টটির নিম্নোক্ত কাঠামো রয়েছে:

#!/bin/sh

<CODE>

for POSITIONAL_PARAM in "$@"
do

    <CODE>

    if [ "$POSITIONAL_PARAM" = '-inf' ]
    then
        <PLUCK $POSITIONAL_PARAM FROM $@>
        break
    fi

    <CODE>

done

<CODE>

some-other-command "$@"

# end of script

এটি করার কোনও ভাল উপায় আছে?

বিটিডাব্লু, যদিও আমি মূলত প্রযোজ্য উত্তরগুলিতে আগ্রহী /bin/sh, আমি কেবলমাত্র প্রযোজ্য উত্তরগুলিতেও আগ্রহী /bin/bash


@ কুওগলম: আমি সিউডো কোডের মূল ফর্মটিতে ফিরে এসেছি; আমার অভিজ্ঞতায়, যখনই আমি ছবিটি খুব বেশি সরল করি, আমি এমন উত্তরগুলি পাই যা বড় আকারের মামলার পক্ষে কাজ করে, তবে আসলটির জন্য নয়।
kjo

উত্তর:


20

POSIXly:

for arg do
  shift
  [ "$arg" = "-inf" ] && continue
  set -- "$@" "$arg"
done

printf '%s\n' "$@"

উপরের কোডটি এমনকি মূল প্যানিক্স শেলগুলিতে কাজ করে, মূল অ্যালকুইস্ট শেল ( এন্ডনোট পড়ুন ) ব্যতীত। forলুপটি এতে পরিবর্তন করুন :

for arg
do
  ...
done

সমস্ত শেল কাজ করার গ্যারান্টি।


অন্য একটি পসিক্স:

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done

এই এক সঙ্গে, আপনাকে প্রথমে সরানোর প্রয়োজন (মধ্যে (pattern)এটি প্রাক POSIX শাঁস কাজ করা।


ধন্যবাদ। সেই যুক্তি সাইকেল চালানোর কৌশলটি খুব সুন্দর। এতে যুক্ত বোনাস রয়েছে যা বর্তমানের অনুসরণ করে প্যারামিটারটি পরীক্ষা করা খুব সহজ করে তোলে (যেহেতু এটি ঠিক সেখানে বসে আছে $1)। আমি যা করছি তার মধ্যে এই সম্পত্তিটি কার্যকর হয়েছিল। এছাড়াও, আমাকে স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ যে লুপের in "$@"; শীর্ষে থাকা বিটটি forঅপ্রয়োজনীয়। এটি এমন কিছু যা আমি আগে দেখেছি, তবে আমি এটি ভুলে যাওয়ার প্রবণতা রাখি। , Almquist শেল আপনার মন্তব্য প্রসঙ্গে নেই do আছে পরের লাইনে প্রদর্শিত, বা হবে for arg; doখুব কাজ করে?
kjo

1
for arg; doঅ্যালকুইস্ট শেলের কাজ
কিউংলম

3
নির্বিঘ্নে for arg doজন্য একটি সংক্ষিপ্ত প্রতিমা for arg in "$@"; do। আমাকে প্রায় 5 সেকেন্ডের জন্য ছুড়ে ফেলেছে! কেউ কেউ বলতে পারে যে
আধুনিকটি

0

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

এখানে আমি যা নিয়ে এসেছি তা এখানে।

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.