কীভাবে চেক করবেন $ পিডব্লিউডি কোনও প্রদত্ত পথের উপ-ডিরেক্টরি ory


25

যেমন $PWD/ বাড়ির উপ-ডিরেক্টরি কিনা তা পরীক্ষা করুন । অন্য কথায় আমি একটি স্ট্রিং অন্যটির সাথে শুরু হয় কিনা তা পরীক্ষা করার জন্য ব্যাশ স্ট্রিং অপারেশনটি অনুসন্ধান করছি।

উত্তর:


26

আপনি যদি ডিরেক্টরিটি অন্যের উপ-ডিরেক্টরি কিনা তা নির্ভরযোগ্যভাবে পরীক্ষা করতে চান, আপনার কেবল স্ট্রিং উপসর্গের চেকের চেয়ে আরও বেশি কিছু প্রয়োজন। গিলসের উত্তরটি এই পরীক্ষাটি সঠিকভাবে কীভাবে করা যায় সে সম্পর্কে বিশদ বর্ণনা করে।

তবে আপনি যদি কোনও সাধারণ স্ট্রিং উপসর্গ পরীক্ষা করতে চান (সম্ভবত আপনি ইতিমধ্যে আপনার পাথগুলি সাধারণ করেছেন?), এটি ভাল:

test "${PWD##/home/}" != "${PWD}"

যদি $PWD"/ home /" দিয়ে শুরু হয় তবে এটি বাম দিকে ছিটকে যায়, যার অর্থ এটি ডান দিকের সাথে মেলে না, সুতরাং "! =" সত্য ফিরে আসে।


1
+1 নিখুঁত এবং আরও সাধারণ ক্ষেত্রে: [ "${PWD##$VAR}" != "$PWD" ]এবং যদি এটি হয় [কোড-গল্ফ] ( স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ট্যাগড / কোড / গল্ফ) আপনি যদি আমাকে দুটি চর দিয়ে মারতেন ;-) এছাড়াও এটি দেখতে দেখতে আরও পঠনযোগ্য ...
টোবিয়াস কেইনজলার 26'11

এফডাব্লুআইডাব্লু, এটি কার্যকর হতে পারে:${PWD/#$HOME/\~}
ব্যবহারকারীর 1338062

ঠিক আছে, তবে কীভাবে পিডব্লিউডি = "/ বাড়ি /.. / ইত্যাদি" সম্পর্কে আলোচনা করা যায়
অ্যালেক্সিস পিটার্স

1
@ অ্যালেক্সিসপিটারস: আপনি ঠিক বলেছেন: আমি প্রশ্নের "স্ট্রিং উপসর্গ" অংশের দিকে মনোনিবেশ করছিলাম এবং এটিকে আরও পরিষ্কার করার জন্য আমি সম্পাদনা করেছি। গিলস সাব ডাইরেক্টরিগুলি যাচাই করার সঠিক পদ্ধতিটি সুন্দরভাবে কভার করেছেন।
Jender

1
"${PWD%%/subdir*}"ব্যবহারকারী বর্তমানে subdirবা এর উপ-ডিরেক্টরিতে রয়েছেন কিনা তা সনাক্ত করতে ব্যবহার করুন subdir, যেহেতু %% শুরুর পরিবর্তে স্ট্রিংয়ের শেষে থেকে ক্যাপচার করে। প্যারামিটার প্রতিস্থাপনের বিষয়ে আরও তথ্যের সন্ধান করা যে কোনও ব্যক্তির পক্ষে এটি কার্যকর হওয়া উচিত: tldp.org/LDP/abs/html/parameter-substedia.html
জর্জ পান্তাজেস

33

কোনও বোর্ন-স্টাইলের শেলটিতে কোনও স্ট্রিং অন্যের উপসর্গ কিনা তা পরীক্ষা করতে:

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; })"/*) 

+1 এই উত্তরের জন্য ধন্যবাদ। এটি জিজ্ঞাসা করার সময় আমি লিঙ্কগুলি এবং ফাইল সিস্টেমের অদ্ভুততাগুলি বিবেচনা করি নি, তবে এটি অবশ্যই জানা ভাল
টোবিয়াস কেইনজলার

8

অপরিশোধিত সংস্করণ:

[ ${PWD:0:6} = "/home/" ]

প্রথমে অক্ষর গণনা করতে হয় এমন একটি অসুবিধা রয়েছে এবং কোনও /home/সাধারণের মতো প্রতিস্থাপন করতে পারে না $1

সাধারণ $VARব্যবহারের সাথে তুলনা করতে সাধারণকরণের জন্য (ধন্যবাদ @ মিশেল) সম্পাদনা করুন

[ "${PWD:0:${#VAR}}" = $VAR ]

4
${#var}দৈর্ঘ্য $var, তাই আপনি এটিকে সাধারণ হিসাবে তৈরি করতে পারেন[ "${PWD:0:${#1}}" = "$1" ]
মাইকেল মরোজেক

@ মিশেল মরোজেক Thanks: ধন্যবাদ, নিখুঁতভাবে কাজ করে :)
টোবিয়াস কেইনজলার

2

আমি প্রশ্নটি খুব ভাল করে বুঝতে পারি না, তবে $ পিডাব্লুডির পিতামাতার সন্ধানের জন্য করণীয় dirname $PWD। পিতামাতার পিতামাতার সন্ধান করতে, চালান dirname $(dirname $PWD), এবং আরও কিছু ...


এটি কেবল তখনই কাজ করবে যদি আমি গভীরতা জানতাম, অন্যথায় আমি শেষ করতাম /। ঠিক আছে, আমি পুনরাবৃত্তির সাথে চেক করতে পারি, তবে এর চেয়ে সহজ কিছু নেই?
টোবিয়াস কেইনজলার 25'11

1
@ টোব যদি কেবল আমি শেল প্রোগ্রামিং জানতাম ;-)
tspp


0

হুঁ, দুঃখের বিষয় যা [পরীক্ষার STRING1 starts with STRING2শর্তের বিকল্প নেই ।

আপনি চেষ্টা করতে পারেন echo $PWD | grep '^$VAR', তবে VARবিশেষ চিহ্ন থাকাতে আকর্ষণীয় উপায়ে এটি ব্যর্থ হতে পারে ।

awkএর indexফাংশনটি কৌশলটি সক্ষম হতে হবে। তবে এগুলি এত সহজে পরীক্ষা করার মতো খুব সহজ জিনিস heavy



0

যদি পথের সন্ধান করা অংশটি পাওয়া যায় তবে আমি ভেরিয়েবলটি "খালি" করব:

[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.