যেমন $PWD
/ বাড়ির উপ-ডিরেক্টরি কিনা তা পরীক্ষা করুন । অন্য কথায় আমি একটি স্ট্রিং অন্যটির সাথে শুরু হয় কিনা তা পরীক্ষা করার জন্য ব্যাশ স্ট্রিং অপারেশনটি অনুসন্ধান করছি।
যেমন $PWD
/ বাড়ির উপ-ডিরেক্টরি কিনা তা পরীক্ষা করুন । অন্য কথায় আমি একটি স্ট্রিং অন্যটির সাথে শুরু হয় কিনা তা পরীক্ষা করার জন্য ব্যাশ স্ট্রিং অপারেশনটি অনুসন্ধান করছি।
উত্তর:
আপনি যদি ডিরেক্টরিটি অন্যের উপ-ডিরেক্টরি কিনা তা নির্ভরযোগ্যভাবে পরীক্ষা করতে চান, আপনার কেবল স্ট্রিং উপসর্গের চেকের চেয়ে আরও বেশি কিছু প্রয়োজন। গিলসের উত্তরটি এই পরীক্ষাটি সঠিকভাবে কীভাবে করা যায় সে সম্পর্কে বিশদ বর্ণনা করে।
তবে আপনি যদি কোনও সাধারণ স্ট্রিং উপসর্গ পরীক্ষা করতে চান (সম্ভবত আপনি ইতিমধ্যে আপনার পাথগুলি সাধারণ করেছেন?), এটি ভাল:
test "${PWD##/home/}" != "${PWD}"
যদি $PWD
"/ home /" দিয়ে শুরু হয় তবে এটি বাম দিকে ছিটকে যায়, যার অর্থ এটি ডান দিকের সাথে মেলে না, সুতরাং "! =" সত্য ফিরে আসে।
${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
ব্যবহারকারী বর্তমানে subdir
বা এর উপ-ডিরেক্টরিতে রয়েছেন কিনা তা সনাক্ত করতে ব্যবহার করুন subdir
, যেহেতু %% শুরুর পরিবর্তে স্ট্রিংয়ের শেষে থেকে ক্যাপচার করে। প্যারামিটার প্রতিস্থাপনের বিষয়ে আরও তথ্যের সন্ধান করা যে কোনও ব্যক্তির পক্ষে এটি কার্যকর হওয়া উচিত: tldp.org/LDP/abs/html/parameter-substedia.html
কোনও বোর্ন-স্টাইলের শেলটিতে কোনও স্ট্রিং অন্যের উপসর্গ কিনা তা পরীক্ষা করতে:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
একই নীতিটি প্রত্যয় বা সাবস্ট্রিং পরীক্ষার জন্য কাজ করে। নোট করুন যে case
ফাইলের নামের মতো নয় এমন কনস্ট্রাক্টসে, *
কোনও /
বা একটি প্রাথমিক সহ কোনও বর্ণের সাথে মেলে .
।
[[ … ]]
সিনট্যাক্স প্রয়োগকারী শেলগুলিতে (যেমন বাশ, কেশ এবং জেডএস), এটি কোনও প্যাটার্নের সাথে স্ট্রিংয়ের সাথে মেলে ব্যবহার করা যেতে পারে। (দ্রষ্টব্য যে [
কমান্ডটি কেবলমাত্র সমতার জন্য স্ট্রিং পরীক্ষা করতে পারে))
if [[ $PWD/ = /home/* ]]; then …
যদি আপনি সুনির্দিষ্টভাবে বর্তমান ডিরেক্টরিটি নীচে রয়েছে কিনা তা /home
পরীক্ষা করে নিচ্ছেন, প্রতীকী লিঙ্কগুলির কারণে একটি সাধারণ সাবস্ট্রিং পরীক্ষা যথেষ্ট নয়।
যদি /home
এটির নিজস্ব একটি ফাইল সিস্টেম হয় তবে পরীক্ষা করুন যে বর্তমান ডিরেক্টরি ( .
) সেই ফাইল সিস্টেমে রয়েছে কিনা ।
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
আপনার যদি নেটবিএসডি, ওপেনবিএসডি বা জিএনইউ (অর্থাত্ লিনাক্স) থাকে তবে readlink
আপনি readlink -f
কোনও পাথ থেকে প্রতীকী লিঙ্কগুলি সরাতে ব্যবহার করতে পারেন ।
case $(readlink -f .)/ in $(readlink -f /home)/*) …
অন্যথায় আপনি pwd
বর্তমান ডিরেক্টরিটি প্রদর্শন করতে ব্যবহার করতে পারেন । তবে আপনার অবশ্যই শেল্টটি অন্তর্নির্মিত না ব্যবহারের যত্ন নিতে হবে যদি আপনার শেল cd
কমান্ড ট্র্যাক করে এবং ডিরেক্টরিটিতে পৌঁছানোর জন্য আপনি যে নামটি ব্যবহার করেন সেটিকে তার "প্রকৃত" অবস্থানের পরিবর্তে রাখে।
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
অপরিশোধিত সংস্করণ:
[ ${PWD:0:6} = "/home/" ]
প্রথমে অক্ষর গণনা করতে হয় এমন একটি অসুবিধা রয়েছে এবং কোনও /home/
সাধারণের মতো প্রতিস্থাপন করতে পারে না $1
।
সাধারণ $VAR
ব্যবহারের সাথে তুলনা করতে সাধারণকরণের জন্য (ধন্যবাদ @ মিশেল) সম্পাদনা করুন
[ "${PWD:0:${#VAR}}" = $VAR ]
${#var}
দৈর্ঘ্য $var
, তাই আপনি এটিকে সাধারণ হিসাবে তৈরি করতে পারেন[ "${PWD:0:${#1}}" = "$1" ]
আমি প্রশ্নটি খুব ভাল করে বুঝতে পারি না, তবে $ পিডাব্লুডির পিতামাতার সন্ধানের জন্য করণীয় dirname $PWD
। পিতামাতার পিতামাতার সন্ধান করতে, চালান dirname $(dirname $PWD)
, এবং আরও কিছু ...
/
। ঠিক আছে, আমি পুনরাবৃত্তির সাথে চেক করতে পারি, তবে এর চেয়ে সহজ কিছু নেই?
ব্যবহার awk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
হুঁ, দুঃখের বিষয় যা [
পরীক্ষার STRING1 starts with STRING2
শর্তের বিকল্প নেই ।
আপনি চেষ্টা করতে পারেন echo $PWD | grep '^$VAR'
, তবে VAR
বিশেষ চিহ্ন থাকাতে আকর্ষণীয় উপায়ে এটি ব্যর্থ হতে পারে ।
awk
এর index
ফাংশনটি কৌশলটি সক্ষম হতে হবে। তবে এগুলি এত সহজে পরীক্ষা করার মতো খুব সহজ জিনিস heavy
যদি পথের সন্ধান করা অংশটি পাওয়া যায় তবে আমি ভেরিয়েবলটি "খালি" করব:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${PWD##$VAR}" != "$PWD" ]
এবং যদি এটি হয় [কোড-গল্ফ] ( স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ট্যাগড / কোড / গল্ফ) আপনি যদি আমাকে দুটি চর দিয়ে মারতেন ;-) এছাড়াও এটি দেখতে দেখতে আরও পঠনযোগ্য ...