it-swarm.com.de

Was bedeuten eckige Klammern ohne das "Wenn" links?

Soweit ich weiß, werden eckige Klammern verwendet, um einen Ausdruck normalerweise in if else-Anweisungen einzuschließen.

Ich habe jedoch festgestellt, dass eckige Klammern ohne das "Wenn" wie folgt verwendet werden:

[ -r /etc/profile.d/Java.sh ] && . /etc/profile.d/Java.sh

im folgenden Skript.

#!/bin/bash### BEGIN INIT INFO  
# Provides:          jbossas7  
# Required-Start:    $local_fs $remote_fs $network $syslog  
# Required-Stop:     $local_fs $remote_fs $network $syslog  
# Default-Start:     2 3 4 5  
# Default-Stop:      0 1 6  
# Short-Description: Start/Stop JBoss AS 7  
### END INIT INFO  
# chkconfig: 35 92 1  

## Include some script files in order to set and export environmental variables  
## as well as add the appropriate executables to $PATH.  
[ -r /etc/profile.d/Java.sh ] && . /etc/profile.d/Java.sh  
[ -r /etc/profile.d/jboss.sh ] && . /etc/profile.d/jboss.sh  

JBOSS_HOME=/sw/AS7  

AS7_OPTS="$AS7_OPTS -Dorg.Apache.Tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true"   ## See AS7-1625  
AS7_OPTS="$AS7_OPTS -Djboss.bind.address.management=0.0.0.0"  
AS7_OPTS="$AS7_OPTS -Djboss.bind.address=0.0.0.0"  

case "$1" in  
    start)  
        echo "Starting JBoss AS 7..."  
        #Sudo -u jboss sh ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS           ##  If running as user "jboss"  
        #start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS   ## Ubuntu  
        ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS &  
    ;;  
    stop)  
        echo "Stopping JBoss AS 7..."  
        #Sudo -u jboss sh ${JBOSS_HOME}/bin/jboss-admin.sh --connect command=:shutdown            ##  If running as user "jboss"  
        #start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/jboss-admin.sh -- --connect command=:shutdown     ## Ubuntu  
        ${JBOSS_HOME}/bin/jboss-cli.sh --connect command=:shutdown  
    ;;  
    *)  
        echo "Usage: /etc/init.d/jbossas7 {start|stop}"; exit 1;  
    ;;  
esac  

exit 0  

Was machen eckige Klammern ohne das "Wenn"? Ich meine genau, was bedeuten sie, wenn sie in diesem Zusammenhang verwendet werden?

Dies ist kein Duplikat von that , in dem das OP "if" verwendet hat, mit dem ich kein Problem habe. In dieser Frage wurden Klammern kontraintuitiv verwendet. Diese Frage und diese Frage mögen dieselbe Antwort haben, aber es handelt sich um zwei verschiedene Fragen.

59
supertonsky

Eckige Klammern sind eine Kurzschreibweise für die Durchführung eines bedingten Tests. Die Klammern [, ebenso gut wie [[ sind tatsächliche Befehle in Unix, ob Sie es glauben oder nicht.

Überlegen:

$ [ -f /etc/rc.local ] && echo "real file"
real file

-and-

$ test -f /etc/rc.local && echo "real file"
real file

In Bash die [ ist ein eingebauter Befehl sowie eine ausführbare Datei. [[ ist nur ein Schlüsselwort für Bash.

Beispiel

Sie können dies mit type bestätigen:

$ type -a [
[ is a Shell builtin
[ is /usr/bin/[

$ type -a [[
[[ is a Shell keyword

Sie können die physische ausführbare Datei hier sehen:

$ ls -l /usr/bin/[
-rwxr-xr-x 1 root root 37000 Nov  3  2010 /usr/bin/[

builtins vs. Keywords

Wenn Sie sich die Bash-Manpage ansehen, man bash finden Sie die folgenden Definitionen für die 2:

  • Schlüsselwörter - Reservierte Wörter sind Wörter, die für die Shell eine besondere Bedeutung haben. Die folgenden Wörter werden als reserviert erkannt, wenn sie nicht in Anführungszeichen stehen, und entweder das erste Wort eines einfachen Befehls (siehe Shell-GRAMMATIK unten) oder das dritte Wort eines Falls oder für einen Befehl:

    ! case  do done Elif else esac fi for function if in select then until while { } time [[ ]]
    
  • builtins - Wenn der Befehlsname keine Schrägstriche enthält, versucht die Shell, ihn zu finden. Wenn eine Shell-Funktion mit diesem Namen vorhanden ist, wird diese Funktion wie oben unter FUNKTIONEN beschrieben aufgerufen. Wenn der Name nicht mit einer Funktion übereinstimmt, sucht die Shell in der Liste der integrierten Shell-Funktionen danach. Wenn eine Übereinstimmung gefunden wird, wird diese integrierte Funktion aufgerufen.

    Wenn der Name weder eine Shell-Funktion noch eine integrierte Funktion ist und keine Schrägstriche enthält, durchsucht bash jedes Element des PATH nach einem Verzeichnis, das eine ausführbare Datei mit diesem Namen enthält. Bash verwendet eine Hash-Tabelle, um sich die vollständigen Pfadnamen der ausführbaren Dateien zu merken (siehe Hash unter Shell-BUILTIN-BEFEHLE unten). Eine vollständige Suche in den Verzeichnissen in PATH wird nur durchgeführt, wenn der Befehl nicht in der Hash-Tabelle gefunden wird. Wenn die Suche nicht erfolgreich ist, sucht die Shell nach einer definierten Shell-Funktion mit dem Namen command_not_found_handle. Wenn diese Funktion vorhanden ist, wird sie mit dem ursprünglichen Befehl und den Argumenten des ursprünglichen Befehls als Argument aufgerufen, und der Exit-Status der Funktion wird zum Exit-Status der Shell. Wenn diese Funktion nicht definiert ist, gibt die Shell eine Fehlermeldung aus und gibt den Beendigungsstatus 127 zurück.

man page

Wenn Sie die Bash-Manpage durchsehen, finden Sie die Details darauf.

test expr
[ expr ]
          Return a status of 0 or 1 depending on the evaluation of the 
          conditional expression expr.  Each operator and operand must be
          a separate argument.  Expressions are composed of the  primaries 
          described  above  under  CONDITIONAL EXPRESSIONS.   test does not 
          accept any options, nor does it accept and ignore an argument of 
          -- as signifying the end of options.

Zuletzt von der Manpage:

          test and [ evaluate conditional expressions using a set of rules
          based on the number of arguments.

EDIT # 1

Folgefrage aus dem OP.

Ok, warum braucht man dann ein "Wenn"? Ich meine, warum "wenn" überhaupt existiert, wenn "[" ausreichen würde.

Das if ist Teil einer Bedingung. Der Befehl test oder [ ... ] Befehl wertet einfach die Bedingung aus und gibt eine 0 oder eine 1 zurück. Die 0 oder 1 wird dann von der if-Anweisung bearbeitet. Die 2 arbeiten zusammen, wenn Sie sie verwenden.

Beispiel

if [ ... ]; then
   ... do this ...
else 
   ... do that ...
fi
70
slm

Ooohh, eines meiner Lieblingsthemen !!

Eckige Klammern sind ein Synonym für den Befehl "test". Wenn Sie die Test-Manpage lesen, werden Sie feststellen, dass Sie den Testbefehl auch als solches aufrufen können

test -r /etc/profile.d/Java.sh

oder

[ -r /etc/profile.d/Java.sh ]

Die Zwischenräume zwischen den Klammern und dem Material innerhalb und außerhalb sind erforderlich.

Der Befehl "test" überprüft in diesem Fall, ob die Datei /etc/profile.d/Java.sh für den aktuellen Benutzer lesbar ist. Impliziert ist natürlich eine Überprüfung, ob es existiert. :-)

Das && ist eine Bash-Syntaxverknüpfung für "Wenn der Befehl links erfolgreich ist, führen Sie den Befehl rechts aus. Dieser zusammengesetzte Befehl ist also eine Abkürzung für ein" Wenn-Dann ", das folgendermaßen aussehen würde:

if test -r /etc/profile.d/Java.sh
then
  /etc/profile.d/Java.sh
fi

Jetzt finden Sie auch doppelte eckige Klammern, die in der Bash-Manpage erläutert werden. Dies ist eine Bash-interne Version einer erweiterten Testfunktion. Beachten Sie, dass diese nicht genau gleich sind. Es gibt Dinge, die Sie mit denen tun können, die Sie mit dem Befehl "test" und seinem Synonym "[" nicht tun können.

30
Mike Diehn