একটি ভেরিয়েবলের শেষে থেকে একটি অক্ষর সরান


130

বাশ অটো সম্পূর্ণরূপে ডিরেক্টরি নামের শেষে / যুক্ত হয়। আমি কীভাবে এটি কোনও অবস্থানগত পরামিতি থেকে সরিয়ে ফেলতে পারি?

#!/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
এবং এটি পসিক্স , তাই বেশ বহনযোগ্য।
go2null

3
রুট (/) সুরক্ষিত রাখার সময় একাধিক চলার '/' স্ট্রিপ নেওয়ার সহজ case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
পদ্ধতির

1
এবং যদি আপনার এটি একটি ভেরিয়েবল, উদাহরণস্বরূপ ডিআইআর দিয়ে ব্যবহার করতে হয়, তবে এটি হবেtarget=${DIR%/}
ব্র্যাড পার্কস

একটি লিঙ্ক মারা গেছে (ইউক্রেন)
Зелди

@ Зелди - ধন্যবাদ, স্থির
মার্টিন ক্লেটন


13

আমি মনে করি পাথের উন্নততর সমাধানের বিকল্পটি realpath $pathবা -mবিকল্পের সাথে যদি এটি না থাকে তবে। এই সমাধানটি অটোমেটিক্যালি অপ্রয়োজনীয় স্ল্যাশগুলি সরিয়ে দেয় এবং পিডাব্লুডিকে যুক্ত করে


রিয়েলপথ খুব পোর্টেবল হওয়ার সম্ভাবনা নেই: unix.stackexchange.com/questions/101080/…
ম্যাথু

রিয়েলপথ জিএনইউ কোর্টিলের একটি অংশ যা লিনাক্স বিতরণে ডি ফ্যাক্টো এবং এই ক্ষেত্রে ব্যবহারকারীরা বিভিন্ন বাহ্যিক প্যাকেজ ইনস্টল করে থাকতে পারে যা বহনযোগ্যতা ভঙ্গ করতে পারে
আমেনজিনস্কি

2
প্রতিটি ডিস্ট্রোতে রিয়েলপথ থাকে না। উদাহরণস্বরূপ, আমি লিনাক্স মিন্ট 17 চালাচ্ছি (যা উবুন্টু ভিত্তিক) এবং এটি ডিফল্টরূপে তা পায় না। এটি रिपোসে রয়েছে তবে এটি স্বয়ংক্রিয়ভাবে ইনস্টল করা হয়নি। এটাই আমি পোস্ট করা লিঙ্কটি নিয়ে আলোচনা করছিল।
ম্যাথু

নির্দিষ্ট ব্যবহারের ক্ষেত্রে ভাল সমাধান যদিও সঠিক হিসাবে চিহ্নিত উত্তরটি শিরোনামের পক্ষে সেরা এবং সবচেয়ে জেনেরিক। আমার জন্য আমি একটি ইউআরএল থেকে ট্রেলিং স্ল্যাশ সরিয়ে ফেলতে চেয়েছিলাম যাতে এটি কাজ না করে। আপনার পরামর্শ সম্পর্কে এখানে, আমি অভিজ্ঞতা থেকে যা পেয়েছি তা হ'ল এটির readlink -fচেয়ে একটু বেশি বহনযোগ্য realpathসংযোজন
flungo

1
এটি আমার পক্ষে কাজ করেছে:target=$(realpath -L --relative-base . $1)
ম্যাটিয়া 72

3

সাবধানতা অবলম্বন করুন, bash3 ব্যাশে পার্ল-অনুরূপ রেজেক্স যুক্ত করেছে। উল্লিখিত গাইড এটিকে পাশাপাশি জিএনইউতে অফিসিয়াল গাইডকেও অন্তর্ভুক্ত করে তবে সমস্ত উল্লেখ তা করে না।

আমি কি করেছিলাম?

বিকল্প 2.19/*হতে 2.19

সমাধান

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

কাজ করে না, স্ল্যাশ এখনও আছে (ভেরিয়েবলের শেষে, যা আপনার উদাহরণে নেই)।
জেলফির কালটসটাহল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.