2017-02-14 13 views
1
input1="/$HOME/Desktop/foo/bar/" 
input2="/$HOME/Desktop/foo/bar" 
target1a=$(basename "$input1") 
target1b="${input1##*/}" 
target2a=$(basename "$input2") 
target2b="${input2##*/}" 

echo $target1a 
echo $target1b 
echo $target2a 
echo $target2b 

戻り なっベース名は、/

bar 

bar 
bar 

barを返すようにtarget1bを取得する方法がある

存在していますか?

$1がしばしばinput1またはinput2バリエーションのようにCLIに入力することができ、私はどちらかのバリエーションが入力されたときbarを返すためにbasenameのではなく、グロブを使用できるようにしたいと思い、bashでタブ補完するために行います。

+1

'$役立ちます場合には、1つの純粋なグロブだ{入力を## * /}'使用していません正規表現(これはグロブスです) –

答えて

2

basenameは、外部ユーティリティを実行するために必要な子プロセスを作成するオーバーヘッドを避けることを前提としています。

もしそうであれば、=~、バッシュの正規表現マッチング演算子を使用する、以下、実行してもよい。

[[ $input1 =~ ([^/]+)/?$ ]] && target1b=${BASH_REMATCH[1]} 

場合正規表現([^/]+)/?$は、後続/を除いて、最後($)パスコンポーネント([^/]+)を捕捉プレゼント(/?)。

正規表現マッチング操作の結果は、特殊配列変数${BASH_REMATCH[@]}に格納され、=~を使用するたびにBashに取り込まれます。どのようなパス成分マッチング部分正規表現がマッチしたことにより、第一(ここだけ)一般キャプチャグループ(要素0は、常に全体的な試合が含まれている)と呼ばれる(...)で囲まれた部分式、であることに、要素1として利用可能である

+1

cool。 Didnt 'は$ {BASH_REMATCH [@]}について知っています。ありがとう – Bleakley

2

は私が(!理にかなって)すでにmklement0's answerが受け入れ見るが、ここでは他の誰  —

target1b="${input1%/}"  # Strip the trailing slash, if any 
target1b="${target1b##*/}" # Now drop the leading directory components 
関連する問題