আমি পড়লাম যে আমার বাশগুলিতে ভেরিয়েবলগুলি উদ্ধৃত করা উচিত, যেমন $ foo এর পরিবর্তে "$ foo"। তবে, স্ক্রিপ্ট লেখার সময়, আমি একটি কেস পেয়েছি যেখানে এটি উদ্ধৃতি ছাড়া কাজ করে তবে তাদের সাথে নয়:
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
এই এক কাজ করে:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
এটির কোনওটি নেই (ডাবল কোটস অরং $ wget_options নোট করুন):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
এটার কারণ কি?
প্রথম লাইনটি ভাল সংস্করণ; বা আমার সন্দেহ করা উচিত যে কোথাও কোনও লুকানো ত্রুটি রয়েছে যা এই আচরণের কারণ হয়ে দাঁড়ায়?
সাধারণভাবে, ব্যাশ এবং এর উদ্ধৃতিগুলি কীভাবে কাজ করে তা বোঝার জন্য আমি কোথায় ভাল ডকুমেন্টেশন পাই? এই স্ক্রিপ্টটি লেখার সময় আমার মনে হয় যে আমি নিয়মগুলি বোঝার পরিবর্তে একটি ট্রায়াল-এন্ড-ত্রুটির ভিত্তিতে কাজ শুরু করেছি।
wget
জানেন না --mirror --no-host-directories
, তবে এটি দুটি আর্গুমেন্টে বিভক্ত হয়ে গেলে এটি পরিচালনা করে । যুক্তি ভেক্টরের অভ্যন্তরে খুব কম প্রোগ্রামগুলি স্পেস এবং কোটগুলি বিশেষভাবে ব্যবহার করে। সমস্যাটি হ'ল bash
, এবং অন্যান্য শেলগুলি বোঝানো হচ্ছে>
bash
, সুতরাং আপনি কল্পনা করতে পারেন যে $a
এটি সরাসরি তার বিষয়বস্তু লেখার সমতুল্য। এখন বিষয়টি স্পষ্ট: a="-a -b"; cmd "$a"
প্রসারিত হয়েছে cmd "-a -b"
, তবে cmd
সম্ভবত এর অর্থ কী তা জানেন না। cmd $a
বিস্তৃতি cmd -a -b
, যা সম্ভবত না হবে।