Bash Script will nich...



  • Hallo Forum,

    wie kann man mehrer Bedingungen einer If Abfrage hintereinander schreiben?

    Ich möchte in jedem Verzeichnis ab dem Homeverzeichnis bestimmt Befehle ausführen. Leider komme ich mit dem If Statement nicht klar. Und 3 mal tief schachteln möchte ich nicht.

    #!/bin/bash
    # 1. Param ist Startverzeichnis.

    for i in $1; do
    if [ -d $i ] && [ $i != "." ] && [ $i != ".." ] ; then
    echo $i " (Dieses Verzeichnis ist ein Unterverzeichnis!)"

    # Rufe dieses Skript mit dem Unterverzeichnis erneut auf.
    sh $0 $i
    fi
    done



  • man test

    statt && nimmst du -a und schreibst alles in einen []-block.



  • Vielen Dank. Das mit den -a funktioniert in anderen Beispielen. Bei mir funktioniert der Vergleich nicht.

    Wie verhindert man das das Skript sich nicht nochmal mit den Verzeichnissen "." und ".." aufruft? Die -ef Vergleich funktioniert bei meinem System nicht. [ $i -ef "."].



  • bash... schrieb:

    Vielen Dank. Das mit den -a funktioniert in anderen Beispielen. Bei mir funktioniert der Vergleich nicht.

    was funktioniert nicht 😕

    if [ -d "$i" -a "$i" != "." -a "$i" != ".." ]; then
      // $i ist ein unterverzeichnis
    fi
    

    ich glaube du willst sowieso eher

    for i in $1/*; do
    ...
    

    Und dann hast du eh keine versteckten Dateien, also auch kein . oder ..



  • Die Vergleiche [ "$i" != "." ] hatte ich wieder mit einzelnen if Statements aufgedröselt und haben immer noch nicht funktioniert. Da nahm ich an das es so nicht geht. Aber egal, mit Deinem 2. Tip funktioniert es. Es soll erstmal nur alle leeren Verzeichnisse löschen:

    #!/bin/bash
    # Removes all empty directories:
    # 1. Param: StartingDir

    # Go recursive through all directories:
    for i in $1/*; do
    if [ -d $i ] ; then
    echo "directory " $i
    sh $0 $i
    fi
    done

    # If the directory has no files, remove them:
    c=`ls -1 $1 | wc -l`
    if [ $c -eq 0 ] ; then
    rmdir $1
    fi



  • Die Vergleiche [ "$i" != "." ] hatte ich wieder mit einzelnen if Statements aufgedröselt und haben immer noch nicht funktioniert. Da nahm ich an das es so nicht geht. Aber egal, mit Deinem 2. Tip funktioniert es. Es soll erstmal nur alle leeren Verzeichnisse löschen:

    #!/bin/bash
    # Removes all empty directories:
    # 1. Param: StartingDir
    
    # Go recursive through all directories:
    for i in $1/*; do
     if [ -d $i ] ; then
      echo "directory " $i
      sh $0 $i
     fi
    done
    
    # If the directory has no files, remove them:
    c=`ls -1 $1 | wc -l`
    if [ $c -eq 0 ] ; then
     rmdir $1
    fi
    

    Und nochmals vielen Dank für die Hilfe 🙂


Anmelden zum Antworten