এই বাশ স্ক্রিপ্টটি কল করার সময় ফাইল আর্গুমেন্টের জন্য উদ্ধৃতিগুলি কেন প্রয়োজনীয়?


13

আমি বাশ স্ক্রিপ্টিংয়ে বেশ নতুন। আমার একটি "টেস্টস্ক্রিপ্ট" আছে, যা আমি আরও উন্নত / দরকারী স্ক্রিপ্টের ভিত্তি হিসাবে ব্যবহার করেছি:

#!/bin/bash
files=$1
for a in $files
do
    echo "$a"
done

যখন আমি কোনও উদ্ধৃতি ছাড়াই এটি কল করি তখন এটি কেবল একটি ডিরেক্টরিতে একটি ফাইল তুলে দেয়:

testscript *.txt

তবে আমি যখন এটিকে উদ্ধৃতি দিয়ে কল করি এটি সঠিকভাবে কাজ করে এবং সমস্ত পাঠ্য ফাইলগুলি খুঁজে বের করে:

testscript '*.txt'

এখানে কি হচ্ছে?


খুব, খুব পরিষ্কার, এটি ঠিক করার সঠিক উপায়টি হ'ল আপনার স্ক্রিপ্টে for a in "$@"; do(বা for a; do) চালানো , এইভাবে গ্লোব্বিংকে বাইরের শেলের কাছে রেখে, উদ্ধৃতিগুলি না রেখে।
চার্লস ডাফি


এই এক নজর ভাল মূল্য। গাইড.bash.academy
ভাসকোহাইট

উত্তর:


29

আপনি যখন একটি প্রোগ্রাম কল

testscript *.txt

তারপরে আপনার শেলটি সম্প্রসারণ করে এবং সমস্ত মান কার্যকর করে। সুতরাং এটি কার্যকরভাবে আপনার প্রোগ্রাম হিসাবে কল করতে পারে

testscript file1.txt file2.txt file3.txt file4.txt

এখন আপনার প্রোগ্রামটি কেবলমাত্র $1তাই দেখায় এবং কেবলমাত্র কাজ করে file1.txt

কমান্ড লাইনে উদ্ধৃতি দিয়ে আপনি *.txtস্ক্রিপ্টে আক্ষরিক স্ট্রিংটি প্রেরণ করছেন এবং এটিই সঞ্চিত রয়েছে $1। আপনার forলুপটি এটি প্রসারিত করে।

সাধারণত আপনি এই জাতীয় স্ক্রিপ্ট ব্যবহার করবেন "$@"না $1

এটি সিএমডি স্ক্রিপ্টিং থেকে আসা লোকদের জন্য একটি "গোটচা", যেখানে কমান্ড শেলটি গ্লোব্বিং করে না (যেমন এটি পরিচিত) এবং সর্বদা আক্ষরিক স্ট্রিংটি পাস করে।


6
শুধু ব্যবহার (উপরে উত্তর লেখক ছাড়া অন্য ব্যক্তিদের জন্য) নির্মল "$@"(যেমন বিরোধিতা $@বা $1 $2 $3) প্রতিটি ফাইলের নাম উদ্ধৃত করা যাবে না "file1.txt" "file2.txt"ইত্যাদি জন্য file1.txtএই অর্থহীন, কিন্তু আপনি আছে যদি my file.txt, মূল্য উদ্ধৃতি হয় সমালোচনামূলক শেল প্রতিরোধ এটিকে দুটি ফাইলনামে রূপান্তর করার জন্য পার্স করা হচ্ছে, একটির নাম myএবং একটি নাম file.txt। সর্বদা ব্যবহারকারীর ইনপুট এবং গ্লোব সম্প্রসারণের উদ্ধৃতি দিন যাতে আপনি কোনও দিন খুব অসন্তুষ্ট হন।
শেঠ রবার্টসন

2
এবং এটি কেবল একটি তাত্ত্বিক নয় - ম্যাক ওএস এক্স একবার একটি আপডেট স্ক্রিপ্ট দিয়েছিল যা আর্গুমেন্টকে যথাযথভাবে উদ্ধৃত করে না এবং কিছু পরিস্থিতিতে লোকের হার্ড ড্রাইভগুলি মোছা শেষ করে।
ফ্লাফি

2
@ ফ্লুফি, আপনার কি এই সম্পর্কে একটি লিঙ্ক আছে?
ওয়াইল্ডকার্ড

@ উইলকার্ড দুর্ভাগ্যক্রমে আমি এটি সম্পর্কে কোনও নিবন্ধ খুঁজে পেতে অক্ষম, তবে এটি যখন ঘটেছিল তখন প্রযুক্তি বিশ্বে এটি একটি বড় সংবাদ। আমি বলতে চাই এটি ২০০৩/২০০৪ বা এর আশেপাশে ছিল, যখন অ্যাপল তখনও ইউএনআইএক্স বিতরণকারী হওয়ার ঝুলন্ত অবস্থায় ছিল।
সাফ

1
@ উইল্ডকার্ড আহ, এটি খুঁজে পেয়েছেন! xlr8yourmac.com/OSX/itunes2_erased_drives.html - এটি আসলে একটি আইটিউনস আপগ্রেড স্ক্রিপ্ট যা অপরাধী ছিল।
ফ্লফি

7

*.txtস্ক্রিপ্ট শুরু করার আগে শেলটি উদ্ধৃতি ছাড়াই প্রসারিত $1হয়, কেবলমাত্র প্রথম ফাইলটি প্রসারিত হয়। সমস্ত txtস্ক্রিপ্ট সেই সময়ে আপনার স্ক্রিপ্টে আর্গুমেন্ট (ধরে নেওয়া খুব বেশি কিছু নেই)।

উদ্ধৃতি সহ যে স্ট্রিংটি স্ক্রিপ্টে প্রসারিত না করেই পাস করা হবে, যা forআপনি প্রত্যাশা করছেন ততই প্রসারিত করতে দেয় ।

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