2017-02-14 8 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 

kehrtbekommen Basisnamen mit Globbing wenn nachlauf/vorliegt

bar 

bar 
bar 

ist es eine Möglichkeit, target1b zu bekommen, um auch bar zurückkehren?

Sie auf die Registerkarte Fertigstellung in bash, $1 kann oft in die cli eingegeben werden, wie in input1 oder input2 Variationen und ich möchte in der Lage sein, anstatt basename zu verwenden Globbing bar zurückzukehren, wenn entweder Variation eingegeben wird.

+1

'$ hilft {input ## * /}' nicht verwendet eine Regex überhaupt. (Es ist ein glob) –

Antwort

2

Ich nehme an, dass Sie basename für den Overhead des Erstellens des untergeordneten Prozesses vermeiden möchten, der benötigt wird, um ein externes Dienstprogramm auszuführen.

Wenn ja, die folgenden, die regex-matching Bedienungs Bash verwendet, =~, tun kann:

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

Regex ([^/]+)/?$ capture die letzte ($) -Pfad Komponente ([^/]+), ein nachlauf / ausgenommen, wenn Geschenk (/?).

Die Ergebnisse der Regex-Matching-Operation werden in der speziellen Array-Variablen ${BASH_REMATCH[@]} gespeichert, die Bash nach jeder Verwendung von =~ auffüllt.
Was die Pfadkomponentenanpassung Unterausdrücke ist als Element 1 verfügbar angepasst, aufgrund der ersten zu sein (und nur hier) subexpression in (...) eingeschlossen, üblicherweise ein Capture-Gruppe genannt (Element 0 immer das gesamte Spiel enthält).

+1

cool. Wusste nicht über $ {BASH_REMATCH [@]} 'Danke – Bleakley

2

Ich sehe Sie schon akzeptiert mklement0's answer (macht Sinn!), Aber hier ist ein reines glob, falls es jemand anderes   —

target1b="${input1%/}"  # Strip the trailing slash, if any 
target1b="${target1b##*/}" # Now drop the leading directory components 
Verwandte Themen