एक चर के अंत से एक चरित्र निकालें


130

बैश ऑटो समापन एक निर्देशिका नाम के अंत में / a जोड़ता है। मैं इसे एक स्थितिगत पैरामीटर से कैसे दूर कर सकता हूं?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup

जवाबों:


242

उपयोग

target=${1%/}

एक संदर्भ


8
और यह POSIX है , इसलिए बहुत अधिक पोर्टेबल है।
go2null

3
रूट (/) को सुरक्षित रखते हुए कई ट्रेलिंग को case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
हटाने के

1
और अगर आपको इसे एक चर के साथ उपयोग करना था, जैसे कि DIR, तो यह होगाtarget=${DIR%/}
ब्रैड पार्क्स

एक लिंक मर चुका है (यूक्रेन)
isелди

@ Зелди - धन्यवाद, निश्चित।
मार्टिन क्लेटन


13

मुझे लगता है कि पथ को बेहतर बनाने के लिए बेहतर समाधान है realpath $pathया -mविकल्प के साथ अगर यह मौजूद नहीं है। यह समाधान स्वचालित रूप से अनावश्यक स्लैश को हटाता है और pwd जोड़ता है


realpath बहुत पोर्टेबल होने की संभावना नहीं है: unix.stackexchange.com/questions/101080/…
मैथ्यू

realpath GNU कोरुटिल्स का एक हिस्सा है जो लिनक्स वितरण में वास्तविक है और इस मामले में उपयोगकर्ताओं ने अलग-अलग बाहरी पैकेज स्थापित किए हो सकते हैं जो पोर्टेबिलिटी को तोड़ सकते हैं
amenzhinsky

2
हर डिस्ट्रो में रियलपैथ शामिल नहीं है। उदाहरण के लिए, मैं लिनक्स मिंट 17 (जो उबंटू आधारित है) चला रहा हूं और यह डिफ़ॉल्ट रूप से नहीं है। यह रिपोज में है, लेकिन यह स्वचालित रूप से स्थापित नहीं है। यही कारण है कि मैंने जो लिंक पोस्ट किया था उस पर चर्चा हो रही थी।
मैथ्यू

निर्दिष्ट उपयोग-मामले के लिए अच्छा समाधान हालांकि सही के रूप में चिह्नित उत्तर शीर्षक और सबसे सामान्य के लिए सबसे अच्छा है। मेरे लिए मैं एक URL से ट्रेलिंग स्लैश को हटाना चाहता था ताकि यह काम न करे। यहाँ आपके सुझाव के बारे में, जो मैंने अनुभव से पाया है, readlink -fवह इससे थोड़ा अधिक पोर्टेबल है realpathएडिटोनल
flungo

1
इसने मेरे लिए काम किया:target=$(realpath -L --relative-base . $1)
मटिया 72

3

सावधान रहें, बैश 3 ने पर्ल-रेगेक्स को बैश में जोड़ा। उल्लिखित गाइड GNU में आधिकारिक गाइड के साथ-साथ इसे भी शामिल करता है , लेकिन सभी संदर्भ ऐसा नहीं करते हैं।

मैंने क्या किया?

स्थानापन्न 2.19/*होना करने के लिए2.19

उपाय

VER="2.19/foo-bar"
NEWVER=${VER%/*}

काम नहीं करता है, स्लेश अभी भी है (चर के अंत में, जो आपके उदाहरण में नहीं है)।
ज़ेलफिर कल्टस्टाहल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.