উদ্ধৃত পরামিতিগুলি গ্রহণ এবং পুনরায় স্থান দেওয়ার জন্য স্ক্রিপ্টটি বাশ করুন


98

আমি কোনও নেস্টেড স্ক্রিপ্টটি নিরাপদে প্রাপ্ত হওয়ার জন্য ব্যাশ স্ক্রিপ্টের উদ্ধৃত পরামিতিগুলি পাওয়ার চেষ্টা করছি। কোন ধারনা?

test.sh

#!/bin/bash
echo $*
bash myecho.sh $*

myecho.sh

#!/bin/bash
 echo $1
 echo $2
 echo $3
 echo $4

নমুনা:

bash test.sh aaa bbb '"ccc ddd"'

ফলাফল:

aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"

ফলাফল চেয়েছিল

aaa bbb "ccc ddd"
aaa
bbb
ccc ddd

4
আমি এই প্রশ্নটি করতেই চলেছিলাম! ভালো সময়জ্ঞান.
স্কটি টি

উত্তর:


70
#!/bin/bash
echo $*
bash myecho.sh "$@"

নোট করুন "$ @" কনস্ট্রাক্ট বাশ নির্দিষ্ট নয় এবং কোনও পসিক্স শেল (এটি কমপক্ষে ড্যাশ দিয়ে থাকে) এর সাথে কাজ করা উচিত। আপনি যে আউটপুটটি চান তা প্রদত্ত নোটটিও নোট করুন, আপনার অতিরিক্ত কোনও স্তরের উদ্ধৃতি দেওয়ার দরকার নেই। IE কেবল উপরের স্ক্রিপ্টটিকে কল করুন:

./test.sh 1 2 "3 4"

5
"$ @" কার্ন এবং বাশ সহ কোনও বোর্ন শেল বা বোর্ন শেল ডেরিভেটিভ (1978 সাল থেকে) নিয়ে কাজ করে। সম্ভবত 95% সময়, "$ @" ব্যবহার করা সঠিক এবং $ * ভুল।
জোনাথন লেফলার

চমৎকার! কিন্তু কারো যদি সেখানে কোন উপায় আছে কি সংরক্ষণ এটি একটি পরিবর্তনশীল মধ্যে "যেমন আছে"? মূল $@কোনও ফাংশনের অভ্যন্তরে উপলব্ধ থাকে না (কারণ এটি ফাংশন আর্গুমেন্ট দ্বারা ওভাররাইট করা হয়)। আমি চেষ্টা করেছি foovar="$@"এবং foovar=$@+ "$foovar"ফাংশনে এবং
কোনওটিই

143

সাবস্ক্রিপ্টে প্যারামিটারগুলি পাস করার জন্য আপনি "$ @" (উদ্ধৃত ডলার) ব্যবহার করতে চান। তাই ভালো ....

ls-color.sh:

#!/bin/bash
/bin/ls --color=auto "$@"    # passes though all CLI-args to 'ls'


কেন.....

থেকে ব্যাশ man পৃষ্ঠা :

$*- এক থেকে শুরু করে অবস্থানগত পরামিতিগুলিতে প্রসারিত হয়। ডাবল উদ্ধৃতিগুলির মধ্যে যখন প্রসারণ ঘটে তখন এটি আইএফএস বিশেষ ভেরিয়েবলের প্রথম অক্ষর দ্বারা পৃথক পৃথক প্রতিটি প্যারামিটারের মান সহ একটি শব্দে প্রসারিত হয়। যে, "$*"সমতুল্য "$1c$2c..." , যেখানে সি আইএফএস ভেরিয়েবলের মানটির প্রথম অক্ষর। যদি আইএফএস সেট না করা থাকে তবে পরামিতিগুলি স্পেস দ্বারা পৃথক করা হয়। যদি আইএফএস নাল হয় তবে পরামিতিগুলি বিভক্তকারীদের বিরতি ছাড়াই যুক্ত করা হবে।

$@- এক থেকে শুরু করে অবস্থানগত পরামিতিগুলিতে প্রসারিত হয়। ডাবল উদ্ধৃতিতে যখন প্রসারণ ঘটে তখন প্রতিটি প্যারামিটার পৃথক শব্দের দিকে প্রসারিত হয়। এটি হ'ল "$@"সমান, "$1" "$2" ...যদি কোনও শব্দের মধ্যে দ্বিগুণ-উদ্ধৃত সম্প্রসারণ ঘটে তবে প্রথম প্যারামিটারের প্রসারটি মূল শব্দের প্রারম্ভিক অংশের সাথে যুক্ত হয় এবং শেষ প্যারামিটারের প্রসারণটি মূলটির শেষ অংশের সাথে যুক্ত হয় শব্দ। যখন কোনও অবস্থানগত পরামিতি থাকে না "$@"এবং $@কিছুইতে প্রসারিত হয় না (যেমন, সেগুলি সরানো হয়)।


কিছু ডেমো স্ক্রিপ্ট সেট আপ করা হচ্ছে ...

echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh $@' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "$@"' > quoted-dollar-at.sh
chmod +x *.sh

"$@"- উদ্ধৃত-ডলার-এটি একটি সাব-শেলের কাছে পুনর্গঠনকারী আরোগুলির জন্য একটি পরিচয় রূপান্তর (সময়ের ~ 99%, আপনি যা বোঝাতে চেয়েছিলেন এটি):

./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2=            
  # $3= 'cc cc'
  # $4= "ddd ddd"

"$*"- উদ্ধৃত-ডলার- স্টারটি একটি একক স্ট্রিংয়ের মধ্যে অর্গগুলি ছিঁড়ে ফেলেছে (আপনি আসলে এই আচরণটি চান এমন সময়কালের 1% eg যেমন: শর্তাধীন if [[ -z "$*" ]]; then ...:):

./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa  'cc cc' "ddd ddd"   
  # $2=                     
  # $3=             
  # $4=

$*/ $@- উদ্ধৃতি ব্যতীত, উভয় ফর্ম কোটেশন এক স্তর থেকে বিচ্ছিন্ন এবং অন্তর্নিহিত স্ট্রিং থেকে ফাঁকা স্থান ব্যাখ্যা কিন্তু উদ্ধৃতি অক্ষর উপেক্ষা (প্রায় সর্বদা, এটি একটি ভুল):

./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc                  
  # $3= cc'
  # $4= "ddd

./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
  # $1= aaa
  # $2= 'cc
  # $3= cc'
  # $4= "ddd

আপনি যদি কিছু মজা করতে চান তবে আপনি "$ @" ব্যবহারের জন্য আপনার পছন্দ মতো গভীর নীড়গুলিতে, পছন্দ করতে চাইলে উপাদানগুলি স্ট্যাকের বাইরে ধাক্কা মেরে এবং পপিং করতে পারেন।

function identity() {
  "$@"
}
set -x
identity identity identity identity identity echo Hello \"World\"
# + identity identity identity identity identity echo Hello '"World"'
# + identity identity identity identity echo Hello '"World"'
# + identity identity identity echo Hello '"World"'
# + identity identity echo Hello '"World"'
# + identity echo Hello '"World"'
# + echo Hello '"World"'
# Hello "World"

4
ব্যাখ্যার জন্য ধন্যবাদ. গ্রেপ ওরফে জন্য সবেমাত্র "$ *" ব্যবহার করা হয়েছে।
অন্ধকারহীন

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