Ü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.
Ü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.
Antworten:
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/#$HOME/\~}
"${PWD%%/subdir*}"
, um zu ermitteln, ob sich der Benutzer derzeit in subdir
oder in einem Unterverzeichnis von befindet subdir
, da %% vom Ende der Zeichenfolge statt vom Anfang erfasst wird. Dies sollte für alle nützlich sein, die weitere Informationen zur Parametersubstitution benötigen
So testen Sie in einer beliebigen Bourne-Shell, ob eine Zeichenfolge ein Präfix einer anderen ist:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
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.)
if [[ $PWD/ = /home/* ]]; then …
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.
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
Wenn Sie NetBSD, OpenBSD oder GNU (dh Linux) haben readlink
, können Sie readlink -f
symbolische Links von einem Pfad entfernen.
case $(readlink -f .)/ in $(readlink -f /home)/*) …
Andernfalls können Sie pwd
das aktuelle Verzeichnis anzeigen. Sie müssen jedoch darauf achten, keine eingebaute Shell zu verwenden, wenn Ihre Shell cd
Befehle verfolgt und den Namen beibehält, den Sie zum Erreichen des Verzeichnisses verwendet haben, anstatt den „tatsächlichen“ Speicherort.
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
Rohversion:
[ ${PWD:0:6} = "/home/" ]
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 kann
[ "${PWD:0:${#VAR}}" = $VAR ]
${#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 Sie dirname $(dirname $PWD)
usw. aus, um das übergeordnete Element des übergeordneten Elements zu finden.
/
. Ok, ich könnte rekursiv prüfen, aber gibt es nicht etwas einfacheres?
Verwenden von awk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
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 es VAR
spezielle Symbole enthält.
awk
Die index
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.
Wenn der gesuchte Teil des Pfades gefunden wird, "entleere" ich die Variable:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${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 ...