एक शेल असाइनमेंट एक एकल शब्द है, जिसमें समान चिह्न के बाद कोई स्थान नहीं है। तो आपने जो लिखा है वह एक खाली मान प्रदान करता है 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
, इसलिए यह एक स्वीकार्य समाधान है यदि आपको पता है कि आपके पास फ़ाइल नामों में अनपेक्षित वर्ण या बैकस्लैश नहीं होंगे।
हमेशा चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें , अर्थात यहां लिखें
echo "Most recent screenshot is: $thefile"
दोहरे उद्धरण चिह्नों के बिना, वैरिएबल का मान पुन: उपयोग किया जाता है, जो व्हाट्सएप या अन्य विशेष वर्णों को शामिल करने पर परेशानी पैदा करेगा।
- आपको किसी पंक्ति के अंत में अर्धविराम की आवश्यकता नहीं है। वे बेमानी हैं, लेकिन हानिरहित हैं।
- एक शेल स्क्रिप्ट में, यह अक्सर शामिल करने के लिए एक अच्छा विचार है
set -e
। यह शेल से बाहर निकलने के लिए कहता है यदि कोई कमांड विफल हो जाता है (नॉनज़रो स्थिति वापस करके)।
यदि आपके पास GNU है (विशेष रूप से यदि आप गैर-एम्बेडेड Linux या Cygwin चला रहे हैं), तो सबसे हाल की फ़ाइल को खोजने के लिए एक और तरीका है: find
फ़ाइलों और उनकी तिथियों की सूची, और उपयोग करें sort
और tail
सबसे छोटी फ़ाइल निकालने के लिए।
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
यदि आप इस स्क्रिप्ट को बैश के बजाय zsh में लिखने के लिए तैयार हैं, तो नवीनतम फ़ाइल को पकड़ने का एक बहुत ही आसान तरीका है, क्योंकि zsh में ग्लोब क्वालिफायर हैं जो वाइल्डकार्ड को न केवल नामों पर, बल्कि फ़ाइल मेटाडाटा पर भी मेल खाते हैं। (om[1])
पैटर्न के बाद का हिस्सा ग्लोब क्वालिफायर है; om
बढ़ती उम्र से मेल खाता है (यानी संशोधन के समय, सबसे पहले नया) और [1]
केवल पहला मैच निकालता है। पूरे मैच को कोष्ठकों में होना चाहिए क्योंकि यह तकनीकी रूप से एक सरणी है, क्योंकि ग्लोबिंग फाइलों की एक सूची देता है, भले ही [1]
इसका मतलब यह हो कि इस विशेष मामले में सूची में (सबसे अधिक) एक फ़ाइल शामिल है।
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"