उदाहरण के लिए जाँच करें कि $PWD
क्या एक उपनिर्देशिका / घर है। दूसरे शब्दों में, मैं यह जांचने के लिए बैश स्ट्रिंग ऑपरेशन खोज रहा हूं कि क्या एक स्ट्रिंग दूसरे के साथ शुरू होती है।
उदाहरण के लिए जाँच करें कि $PWD
क्या एक उपनिर्देशिका / घर है। दूसरे शब्दों में, मैं यह जांचने के लिए बैश स्ट्रिंग ऑपरेशन खोज रहा हूं कि क्या एक स्ट्रिंग दूसरे के साथ शुरू होती है।
जवाबों:
यदि आप मज़बूती से परीक्षण करना चाहते हैं कि क्या एक निर्देशिका दूसरे की उपनिर्देशिका है, तो आपको एक स्ट्रिंग उपसर्ग चेक से अधिक की आवश्यकता होगी। गिल्स के जवाब में विस्तार से बताया गया है कि यह परीक्षण कैसे ठीक से किया जाए।
लेकिन अगर आप एक साधारण स्ट्रिंग प्रीफिक्स चेक चाहते हैं (हो सकता है कि आपने पहले से ही अपने रास्तों को सामान्य कर लिया है?), यह एक अच्छा है:
test "${PWD##/home/}" != "${PWD}"
यदि $PWD
"/ home /" से शुरू होता है, तो यह बाईं ओर से हट जाता है, जिसका अर्थ है कि यह दाईं ओर से मेल नहीं खाएगा, इसलिए "! =" सही है।
${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
यह पता लगाने के लिए उपयोग करें कि क्या उपयोगकर्ता वर्तमान में subdir
या उपनिर्देशिका में है subdir
, क्योंकि %% शुरुआत के बजाय स्ट्रिंग के अंत से कैप्चर करता है। पैरामीटर प्रतिस्थापन पर अधिक जानकारी के लिए यह किसी के लिए उपयोगी होना चाहिए: tldp.org/LDP/abs/html/parameter-substitution.html
यह जांचने के लिए कि क्या कोई स्ट्रिंग किसी बॉर्न-शैली के शेल में दूसरे का उपसर्ग है:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
एक ही सिद्धांत प्रत्यय या प्रतिस्थापन परीक्षण के लिए काम करता है। ध्यान दें कि case
निर्माण में, फ़ाइल नामों के विपरीत, *
किसी भी वर्ण से मेल खाता है, जिसमें एक /
प्रारंभिक या एक प्रारंभिक शामिल है .
।
[[ … ]]
सिंटैक्स (यानी बैश, ksh और zsh) को लागू करने वाले गोले में , यह एक पैटर्न के खिलाफ एक स्ट्रिंग से मेल खाने के लिए इस्तेमाल किया जा सकता है। (ध्यान दें कि [
कमांड केवल समानता के लिए तारों का परीक्षण कर सकता है।)
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
यदि आपके पास NetBSD, OpenBSD या GNU (यानी लिनक्स) है 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" ]
मुझे सवाल बहुत अच्छी तरह से समझ में नहीं आता है, लेकिन $ PWD के माता-पिता को खोजने के लिए , क्या करें 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
समारोह चाल करने के लिए सक्षम होना चाहिए। लेकिन यह सब परीक्षण के लिए इतनी आसान चीज के लिए बहुत भारी लगता है।
यदि पथ का खोजा गया भाग मुझे चर "खाली" लगता है:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${PWD##$VAR}" != "$PWD" ]
और अगर यह एक [कोड-गोल्फ] ( stackoverflow.com/questions/tagged/code-golf)question था, तो आपने मुझे दो वर्णों से पीटा होगा; ;-) यह भी दिखता है अधिक पठनीय ...