শেল অ্যাসাইনমেন্টটি একটি একক শব্দ, সমান চিহ্নের পরে স্থান নেই। সুতরাং আপনি যা লিখেছেন তা একটি খালি মান নির্ধারণ করে 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"