শেল অ্যাসাইনমেন্টটি একটি একক শব্দ, সমান চিহ্নের পরে স্থান নেই। সুতরাং আপনি যা লিখেছেন তা একটি খালি মান নির্ধারণ করে thefile; এছাড়াও, যেহেতু অ্যাসাইনমেন্টটি একটি কমান্ডের সাথে গোষ্ঠীযুক্ত, এটি thefileপরিবেশকে পরিবর্তনশীল করে এবং অ্যাসাইনমেন্টটি সেই নির্দিষ্ট কমান্ডের স্থানীয়, অর্থাত্ lsনির্ধারিত মানটি দেখার জন্য কেবল কল ।
আপনি একটি কমান্ডের আউটপুট ক্যাপচার করতে চান, সুতরাং আপনার কমান্ড প্রতিস্থাপন ব্যবহার করা উচিত :
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(কিছু সাহিত্য একটি বিকল্প বাক্য গঠন দেখায় thefile=`ls …`; ব্যাককোটের বাক্যবিন্যাসের মাঝে বাকী উদ্ধৃতিগুলি ডলার-প্যারেন্টিস সিনট্যাক্সের সমতুল্য হয়, ব্যাককোটের অভ্যন্তরে উদ্ধৃতিটি মাঝে মাঝে অদ্ভুত থাকে, তাই কেবল ব্যবহার করুন $(…)))
আপনার স্ক্রিপ্ট সম্পর্কে অন্যান্য মন্তব্য:
- সংযুক্ত
-t(সময় অনুসারে বাছাই) সাথে -U(বাছাই করবেন না) বোঝা যায় না; শুধু ব্যবহার -t।
grepস্ক্রিনশটগুলির সাথে মেলে ব্যবহার করার পরিবর্তে , একটি ওয়াইল্ডকার্ড পাস করা আরও পরিষ্কার lsএবং headপ্রথম ফাইলটি ক্যাপচার করার জন্য:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
এর আউটপুট পার্স করাls সাধারণত একটি খারাপ ধারণা । প্রিন্টেবল অক্ষরগুলির সাথে আপনার ফাইলের নাম থাকলে এটি বেশ খারাপভাবে ব্যর্থ হতে পারে। তবে, তারিখ অনুসারে ফাইলগুলি বাছাই করা কঠিন ls, সুতরাং যদি আপনি জানেন যে ফাইলের নামে আপনার হাতে ছাপানো অক্ষর বা ব্যাকস্ল্যাশ নেই an
চলক বিকল্পের চারপাশে সর্বদা ডাবল উদ্ধৃতি ব্যবহার করুন , এখানে এখানে লিখুন
echo "Most recent screenshot is: $thefile"
ডাবল উক্তি ব্যতীত ভেরিয়েবলের মান পুনরায় ছড়িয়ে দেওয়া হয়, এতে যদি সাদা জায়গা বা অন্যান্য বিশেষ অক্ষর থাকে তবে সমস্যা দেখা দেয়।
- কোনও রেখার শেষে আপনার অর্ধিকোলনের দরকার নেই। এগুলি অনর্থক তবে ক্ষতিহীন।
- শেল স্ক্রিপ্টে এটি অন্তর্ভুক্ত করা প্রায়শই ভাল ধারণা
set -e। এটি শেলটিকে কোনও কমান্ড ব্যর্থ হলে (ননজারো স্থিতি ফিরিয়ে দিয়ে) প্রস্থান করতে বলেছে।
আপনি গনুহ এটি আছে (বিশেষ করে যদি আপনি অ এমবেডেড লিনাক্স বা Cygwin চালাচ্ছেন), তাহলে সাম্প্রতিকতম ফাইল খোঁজার আরেকটি পদ্ধতির আছে: আছে findফাইল এবং তাদের তারিখগুলি তালিকা, এবং ব্যবহার sortএবং tailকনিষ্ঠ ফাইল Extract করুন।
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
আপনি যদি এই স্ক্রিপ্টটি বাশের পরিবর্তে zsh এ লিখতে ইচ্ছুক হন তবে নতুন ফাইলটি ধরার আরও সহজ উপায় আছে, কারণ zsh এর কাছে গ্লোব কোয়ালিফায়ার রয়েছে যা ওয়াইল্ডকার্ডকে কেবল নামেই নয়, ফাইল মেটাটাটাতেও মেলানোর অনুমতি দেয়। (om[1])প্যাটার্ন পর অংশ উল্লিখিত glob কোয়ালিফায়ার হয়; omবয়সের বৃদ্ধির মাধ্যমে ম্যাচগুলি বাছাই করে (অর্থাত্ পরিবর্তনের সময়, নতুন প্রথম) এবং [1]কেবল প্রথম ম্যাচটি বের করে। পুরো ম্যাচটি বন্ধনীতে হওয়া দরকার কারণ এটি প্রযুক্তিগতভাবে একটি অ্যারে, যেহেতু গ্লোব্বিং ফাইলগুলির একটি তালিকা ফিরিয়ে দেয়, এমনকি যদি [1]এই নির্দিষ্ট ক্ষেত্রে তালিকার একটি ফাইল থাকে (সর্বাধিক)।
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"