Überprüfen Sie beispielsweise, ob $PWD
es sich um ein Unterverzeichnis von / home handelt. Mit anderen Worten, ich suche nach einer Bash-String-Operation, um zu überprüfen, ob ein String mit einem anderen beginnt.
25
Wenn Sie zuverlässig testen möchten, ob ein Verzeichnis ein Unterverzeichnis eines anderen ist, benötigen Sie mehr als nur eine Zeichenfolgepräfixprüfung. In der Antwort von Gilles wird ausführlich beschrieben, wie dieser Test ordnungsgemäß durchgeführt wird.
Wenn Sie jedoch eine einfache Überprüfung des Zeichenfolgepräfixes wünschen (haben Sie Ihre Pfade möglicherweise bereits normalisiert?), Ist dies eine gute Option:
test "${PWD##/home/}" != "${PWD}"
Wenn $PWD
mit "/ home /" begonnen wird, wird es auf der linken Seite entfernt, was bedeutet, dass es nicht mit der rechten Seite übereinstimmt. "! =" Gibt also true zurück.
[ "${PWD##$VAR}" != "$PWD" ]
Und wenn dies eine [Code-Golf] ( stackoverflow.com/questions/tagged/code-golf ) -Frage wäre, hättest du mich um zwei Zeichen geschlagen ;-) Sieht auch so aus lesbarer ...${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
, um zu ermitteln, ob sich der Benutzer derzeit insubdir
oder in einem Unterverzeichnis von befindetsubdir
, da %% vom Ende der Zeichenfolge statt vom Anfang erfasst wird. Dies sollte für alle nützlich sein, die weitere Informationen zur Parametersubstitution benötigenSo testen Sie in einer beliebigen Bourne-Shell, ob eine Zeichenfolge ein Präfix einer anderen ist:
Das gleiche Prinzip gilt für einen Suffix- oder Teilzeichenfolgetest. Beachten Sie, dass in
case
Konstrukten im Gegensatz zu Dateinamen*
jedes Zeichen, einschließlich eines/
oder einer Initiale , übereinstimmt.
.In Shells, die die
[[ … ]]
Syntax implementieren (z. B. bash, ksh und zsh), kann eine Zeichenfolge mit einem Muster verglichen werden. (Beachten Sie, dass der[
Befehl nur Zeichenfolgen auf Gleichheit testen kann.)Wenn Sie speziell testen, ob sich das aktuelle Verzeichnis darunter befindet
/home
, reicht ein einfacher Teilzeichenfolgetest aufgrund symbolischer Verknüpfungen nicht aus.Wenn
/home
es sich um ein eigenes Dateisystem handelt, prüfen Sie, ob sich das aktuelle Verzeichnis (.
) auf diesem Dateisystem befindet.Wenn Sie NetBSD, OpenBSD oder GNU (dh Linux) haben
readlink
, können Siereadlink -f
symbolische Links von einem Pfad entfernen.Andernfalls können Sie
pwd
das aktuelle Verzeichnis anzeigen. Sie müssen jedoch darauf achten, keine eingebaute Shell zu verwenden, wenn Ihre Shellcd
Befehle verfolgt und den Namen beibehält, den Sie zum Erreichen des Verzeichnisses verwendet haben, anstatt den „tatsächlichen“ Speicherort.quelle
Rohversion:
Hat den Nachteil, dass man zuerst die Zeichen zählen muss und nicht
/home/
durch etwas allgemeines wie ersetzen kann$1
.edit (danke @Michael) für die verallgemeinerung die man zum vergleichen
$VAR
benutzen kannquelle
${#var}
ist die Länge von$var
, also können Sie es verallgemeinern als[ "${PWD:0:${#1}}" = "$1" ]
Ich verstehe die Frage nicht so gut, aber um die Eltern von $ PWD zu finden , tun Sie es
dirname $PWD
. Führen Siedirname $(dirname $PWD)
usw. aus, um das übergeordnete Element des übergeordneten Elements zu finden.quelle
/
. Ok, ich könnte rekursiv prüfen, aber gibt es nicht etwas einfacheres?Verwenden von
awk
:quelle
Hm, es ist schade, dass
[
es keine Möglichkeit gibt,STRING1 starts with STRING2
Bedingungen zu testen .Sie können es versuchen
echo $PWD | grep '^$VAR'
, aber es kann auf interessante Weise scheitern, wenn esVAR
spezielle Symbole enthält.awk
Dieindex
Funktion von sollte in der Lage sein, den Trick auszuführen. Aber das alles scheint einfach zu schwer, als dass es so einfach zu testen wäre.quelle
Wenn der gesuchte Teil des Pfades gefunden wird, "entleere" ich die Variable:
quelle