উত্তর:
এই সাধারণ ব্যাশ ওয়ান-লাইনার ব্যবহার করুন:
if [ -e FILENAME ] ; then echo Yes ; fi
-eসত্যতে চেক মূল্যায়ণ যদি FILENAMEবিদ্যমান, সেটা ব্যাপার নয় কি এটা (ফাইল, ডিরেক্টরি, লিংক, ডিভাইসের, ...)।
আপনি যদি কেবল নিয়মিত ফাইলগুলি পরীক্ষা করতে চান তবে তার -fপরিবর্তে @ অ্যারোনিকাল বলেছিলেন use
FILENAMEকোনও পরিবর্তনশীল প্রসার হয় বা কোনও বিশেষ অক্ষর থাকে তবে তা উদ্ধৃত করতে ভুলবেন না। যেমন একটি স্ক্রিপ্ট [ -e "$1" ] && echo Yes,।
[[এবং ]]পরিবর্তে পরিবর্তনশীল উদ্ধৃতি করুন।
[[ ]], সর্বদা উদ্ধৃতি দেওয়া শুরু করা ব্যক্তিদের পক্ষে ভাল অভ্যাস যা [[ ]]অপারেটরের অভ্যন্তরে বিশেষ নিয়মগুলি মনে রাখে না বা গাণিতিক প্রসঙ্গে।
আপনি এই সহজ স্ক্রিপ্ট ব্যবহার করতে পারেন:
#!/bin/bash
if [[ -f $1 ]]; then
echo "Yes"
exit 0
else
exit 1
fi
এটি হিসাবে সংরক্ষণ করুন file-exists.sh। তারপরে, টার্মিনালে টাইপ করুন chmod +x file-exists.sh।
এটির মতো ব্যবহার করুন: ./file-exists.sh FILEআপনি FILEযে ফাইলটি যাচাই করতে চান তা প্রতিস্থাপন করুন, উদাহরণস্বরূপ:
./file-exists.sh file.txt
যদি file.txtবিদ্যমান থাকে Yesতবে টার্মিনালে মুদ্রিত হবে এবং প্রোগ্রামটি 0 (সাফল্য) সহ প্রস্থান করবে। যদি ফাইলটি বিদ্যমান না থাকে তবে কিছুই মুদ্রিত হবে না এবং প্রোগ্রামটি স্থিতি 1 (ব্যর্থতা) সহ প্রস্থান করবে।
আপনি যদি কৌতূহলী হন তবে কেন আমি exitআদেশটি অন্তর্ভুক্ত করেছি , পড়ুন ...
exitকমান্ড দিয়ে কি হবে ?exitস্বাভাবিক প্রক্রিয়া সমাপ্তির কারণ। এর অর্থ কী, মূলত: এটি স্ক্রিপ্টটি বন্ধ করে দেয়। এটি একটি alচ্ছিক (সংখ্যাসূচক) পরামিতি গ্রহণ করে যা স্ক্রিপ্টের প্রস্থান স্থিতি হবে called
এই প্রস্থান স্থিতিটি আপনার অন্যান্য স্ক্রিপ্টগুলি আপনার file-existsস্ক্রিপ্টটি ব্যবহার করতে সক্ষম করে এবং এটি ফাইলটি জানার তাদের উপায় বিদ্যমান বা না।
এটি ব্যবহারের জন্য রাখার একটি সাধারণ উদাহরণ হ'ল এই স্ক্রিপ্টটি (এটি সংরক্ষণ করুন file-exists-cli.sh):
#!/bin/bash
echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
echo "$FILE exists"
else
echo "$FILE does not exist"
fi
সাধারণ করুন chmod +x file-exists-cli.shএবং তারপরে এটি চালান : ./file-exists-cli.sh. আপনি এরকম কিছু দেখতে পাবেন:
ফাইল বিদ্যমান ( exit 0):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
booleans.py
booleans.py exists
ফাইল বিদ্যমান নেই ( exit 1):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
asdf
asdf does not exist
"$1"। এটিতে যদি সাদা জায়গা থাকে তবে তা উদ্ধৃতি ছাড়াই ভেঙে যাবে এবং অন্যান্য খারাপ জিনিস ঘটতে পারে।
কমান্ড লাইনের ব্যাশ শেলের মধ্যে।
if [[ -f /path/to/file ]]; then echo "Yes"; fi
এটি ব্যাশ শর্তসাপেক্ষ অপারেটরটি ব্যবহার করে -fএবং ফাইলটি বিদ্যমান এবং একটি নিয়মিত ফাইল কিনা তা পরীক্ষা করে দেখছে। আপনি যদি ডিরেক্টরি এবং লিঙ্কগুলি সহ যে কোনও ফাইলের পরীক্ষা করতে চান তবে ব্যবহার করুন -e।
testএটির আসল ফর্ম্যাটে ভক্ত নই , আমি জানি এটি অত্যধিক কিল, তবে এটি আমার অভ্যাস।
[কমান্ডটি না বলার পরিবর্তে , যা সাধারণত একটি বিল্টিন বলে।) তারা একক ব্রেস সংস্করণের অসঙ্গতি এবং বোবা আচরণগুলি সংশোধন করে। [বিল্টিনটি সামঞ্জস্যের জন্য রয়ে গেছে, তবে নতুন ব্যাশ কোডে এটি ব্যবহার করার কোনও ভাল কারণ আমি দেখতে পাচ্ছি না। (আপনার যদি পসিক্স-কমপ্লায়েন্ট স্ক্রিপ্টগুলি লেখার দরকার হয় যা প্রাচীন শেল বা অন্য কোনও কিছুতে চলতে পারে তবে এটি আলাদা))
[সাধারণত একটি বিল্টিনকে কল করেন" সন্দেহজনক। type -a [আমার জন্য "শেল বিল্টিন", তারপরে "তালিকাবদ্ধ করে /usr/bin/[।"
typeফলাফলগুলি কি বলেছিল তা সংবিধানিত বলে মনে হচ্ছে, না?
আপনি যা চান তার জন্য সংক্ষিপ্ততম আদেশটি হ'ল:
test -e FILENAME && echo Yes
test -eপ্রদত্ত নামটি ফাইল সিস্টেমে বিদ্যমান কিনা তা পরীক্ষা করবে। (আপনি test -fকেবল নিয়মিত ফাইলগুলিতে সীমাবদ্ধ রাখতে ব্যবহার করতে পারেন man testmore আরও দেখুন ))
প্রদত্ত শর্তটি যদি সত্যকে মূল্যায়ন করে তবে testসফল প্রস্থান স্থিতি ফিরে আসে (অন্যথায় এটি একটি ব্যর্থতার স্থিতি ফিরিয়ে দেয়)। আমরা দুটি কমান্ড ব্যবহার করে একত্রিত করি &&যার অর্থ "পূর্ববর্তী কমান্ডটি সাফল্যের স্থিতি দিয়ে উপস্থিত থাকলে পরবর্তী কমান্ড কার্যকর করুন"। পরবর্তী কমান্ডটি কেবল Yesস্ট্যান্ডার্ড আউটপুটে প্রিন্ট করে; টার্মিনালে একটি ইন্টারেক্টিভ শেলের ক্ষেত্রে।
এটি একটি ifবিবৃতিতে অতিরিক্ত পাঠ্য উপাদান এড়িয়ে চলেছে , তবুও একই ফলাফল দেয়। ব্যবহার &&(বা তার বিপরীত ||) কমান্ড একসঙ্গে গিঁট ভাল কাজ করে যখন শুধুমাত্র একটি একক কমান্ডের সাথে জড়িত আছেন। আপনি যদি একক কমান্ডের প্রস্থান স্থিতির প্রতিক্রিয়া হিসাবে একটি একক কমান্ড কার্যকর করার চেয়ে আরও বেশি কিছু করতে চান তবে ifসিনট্যাক্সটি দ্রুত ব্যবহার করা আরও বেশি পঠনযোগ্য হয়ে যায়।
অন্যান্য জবাব হিসাবে ইতিমধ্যে ইঙ্গিত হিসাবে, সমতুল্য ifশৈলী নির্মাণ হবে:
if test -e FILENAME; then echo Yes; fi
বা বিকল্পভাবে:
if test -e FILENAME
then
echo Yes
fi
এই উদ্দেশ্যে, [এবং testসমতুল্য, বাদে এটি [একটি সমাপ্তি দাবি করে ]।
এই ধরণের প্রশ্নের চামড়ার জন্য একাধিক উপায় রয়েছে এবং এখানে আরও একটি প্রশ্ন রয়েছে: পতাকা findসহ কমান্ডটি ব্যবহার করুন -exec। ফাইলের পথে দুটি অংশে বিভক্ত করা যায় find /etcযা ডিরেক্টরি সেট করে এবং -name FILENAMEযা ফাইলের নাম নির্দিষ্ট করে (ডু!)। -maxdepthরাখা হবে findসঙ্গে কাজ /etcশুধুমাত্র ডিরেক্টরি ও সাব মধ্যে নামা করা হবে না
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$
অন্য উপায়, এর মাধ্যমে stat:
adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES
এবং বিকল্পভাবে পাইথনের মাধ্যমে:
>>> import os
>>> if os.stat('/etc/passwd'):
... print 'YES'
...
YES
>>> if os.stat('/etc/passwd1'):
... print 'YES'
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'
বা একটি শর্ট কমান্ড লাইনের বিকল্প:
python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
[ -e FILENAME ] && echo Yes