ব্যাশ স্ক্রিপ্টে input 1 এবং $ 2 এর মতো নির্দিষ্ট ইনপুট ভেরিয়েবলগুলি বাদ দেওয়ার সময় আমি কীভাবে $ * ব্যবহার করব?


15

উদাহরণ স্বরূপ,

elif [[ $append = $1 ]]
then
  touch ~/directory/"$2".txt
  echo "$variable_in_question" >> ~/directory/"$2".txt

হয় সমস্ত ইনপুট অনুসরণ করে একটি পাঠ্য ফাইল তৈরি করতে "$2", বা সমস্ত ইনপুট অনুসরণ করে একটি বিদ্যমান পাঠ্য ফাইল সংযুক্ত "$2"করতে "$variable_in_question", লাইন 4- এর জায়গায় আমি কী ব্যবহার করব ?

আমি মূলত চাই "$*", কিন্তু বাদ "$1"এবং "$2"

উত্তর:


32

আপনি একটি পরিসীমা নির্দিষ্ট করতে bashপ্যারামিটার সম্প্রসারণ ব্যবহার করতে পারেন , এটি অবস্থানগত পরামিতিগুলির সাথেও কাজ করে। এর জন্য $3... $nএটি হবে:

"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"

উভয় সচেতন থাকুন $@এবং $*প্রথম যুক্তি উপেক্ষা করুন $0। আপনি যদি ভাবেন যে আপনার ক্ষেত্রে কোনটি ব্যবহার করবেন: আপনি সম্ভবত একটি উদ্ধৃতি চান এটি খুব সম্ভবত $@$*আপনি সুস্পষ্টভাবে আর্গুমেন্টগুলি স্বতন্ত্রভাবে উদ্ধৃত হওয়া না চাইলে ব্যবহার করবেন না ।

আপনি নিম্নলিখিত হিসাবে এটি ব্যবহার করে দেখতে পারেন:

$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6

নোট করুন যে প্রথম উদাহরণে $0প্রথম যুক্তিতে পূর্ণ হয় 0যখন কোনও স্ক্রিপ্টে ব্যবহৃত $0হয় পরিবর্তে স্ক্রিপ্টের নামটি পূরণ করা হয়, যেমন দ্বিতীয় উদাহরণটি দেখায়। থেকে স্ক্রিপ্টের নাম bashঅবশ্যই হয় , প্রথম যুক্তি ঠিক যে এটা স্বাভাবিকভাবে যেমন অনুভূত না - একই যায় জন্য একটি স্ক্রিপ্ট এক্সিকিউটেবল তৈরি এবং "সরাসরি" বলা। সুতরাং প্রথম উদাহরণে আমাদের $0= 0, $1= 1ইত্যাদি রয়েছে যখন দ্বিতীয়টিতে এটি $0= script_file, $1= 0, $2= 1ইত্যাদি; ${@:3}শুরু করে প্রতিটি যুক্তি নির্বাচন করে $3

সম্ভাব্য ব্যাপ্তির জন্য কিছু অতিরিক্ত উদাহরণ:

 # two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
 # every argument starting with the second to last one
 # a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
 # two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3

আরও পড়া:


27

আপনি shiftবিল্টিন ব্যবহার করতে পারেন :

$ help shift
shift: shift [n]
    Shift positional parameters.

    Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is
    not given, it is assumed to be 1.

    Exit Status:
    Returns success unless N is negative or greater than $#.

যাত্রা। প্রদত্ত

$ cat argtest.bash 
#!/bin/bash

shift 2

echo "$*"

তারপর

$ ./argtest.bash foo bar baz bam boo
baz bam boo

3
@ ওরিওপ্লাজম আমি মনে করি এটি উল্লেখযোগ্য যে এই shiftপদ্ধতির অ্যাক্সেস করা অসম্ভব হয়ে যাবে $1এবং $2আপনি তাদের স্থানান্তরিত করার পরে after আপনার স্ক্রিপ্টে আপনি $2পাশাপাশি ব্যবহার করেন $variable_in_question, আপনাকে এটি পরিবর্তন করতে হবে বা প্যারামিটার এক্সপেনশন পদ্ধতির ব্যবহার করতে হবে।
মিষ্টান্ন

6
shiftপ্রথমটি যখন এক বা একাধিক আরোগুলি বিশেষ থাকে তখন ভাল হয় এবং এগুলি আলাদা ভেরিয়েবলগুলিতে বাছাই করা বোধগম্য হয় ( foo="$1"; bar="$2";বা if [[ something with $1 ]];then blah blah; shift। তবে @ ডেজার্টের অ-ধ্বংসাত্মক পদ্ধতির সাথে উত্তরগুলি অন্যান্য ক্ষেত্রে যখন আপনি এখনও পুরো তালিকাটি পরে চান না তখন চমৎকার হয় , বা যখন আপনি সীমাবদ্ধ আরগগুলি বেছে নেওয়ার জন্য ফ্যানসিয়ার সিনট্যাক্স ব্যবহার করেন, অনন্তের বাইরে নয়, কোনও কমান্ডে খালি আরগগুলি প্রবর্তন না করেই যদি $@এমন অনেক উপাদান থাকে না
পিটার কর্ডেস

13

সাধারণত, আপনি অবস্থানের প্যারামিটারগুলিকে একটি অ্যারে অনুলিপি করতে পারবেন, অ্যারের স্বেচ্ছাসেবক সূচকগুলি মুছুন এবং তারপরে আপনার মূল যুক্তিগুলি না হারিয়ে আপনি ঠিক সেই সূচকগুলিতে প্রসারিত করতে অ্যারেটি ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, যদি আমি প্রথম, চতুর্থ এবং পঞ্চম বাদে সমস্ত আরগগুলি চাইতাম:

args=( "$@" )
unset args[0] args[3] args[4]
echo "${args[@]}"

অনুলিপিতে, সূচকগুলি 1 দ্বারা স্থানান্তরিত হয়, যেহেতু এর $0অংশ নয় $@


1
অবশ্যই এটি একত্রিত করা সম্ভব, যেমন echo "${args[@]:2}"তৃতীয় থেকে শেষ যুক্তির জন্য।
মিষ্টান্ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.