Autor Thema: Bashscript (test Kommando)  (Gelesen 2122 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Jaob

  • Neuling
  • *
  • Beiträge: 4
  • Desktop: Xfce4
  • Skill: Anfänger
Bashscript (test Kommando)
« am: 08. März 2016, 21:01:32 »
Hallo :)

Ich habe mal eine Frage zu dem test Kommando [ ].

Undzwar habe ich in einem alten Script folgende Zeile gefunden:
Code: Bash
  1. [ -x `which test1` ];
  2. echo "$?"
Wenn das Programm test1 nicht existiert, bekomme ich folgende Meldung:
which: no test1 in (/usr/local/sbin:...)Warum bekomme ich in dem Script den Rückgabewert 0, was ja so viel wie true bedeutet? Ich hab nichts im Internet gefunden und auch durch Wordsplitting (IFS ist nicht gesetzt) kann ich mir das nicht erklären. In dem Fall werden ja die einzelnen Wörter anhand der Leerzeichen getrennt, aber dann müsste ja eig. ein Fehler aufgrund zu vieler Argumente zurückgegeben werden.

Offline Pig of Destiny

  • Held Mitglied
  • *****
  • Beiträge: 1383
  • Dankeschön: 125 mal
  • Desktop: Xfce
  • Grafikkarte: Intel Graphics
  • Grafikkartentreiber: free
  • Kernel: 4.16
  • Prozessor: Intel Celeron N3350
  • Skill: Durchschnitt
  • Zweig: Arch Linux
Re: Bashscript (test Kommando)
« Antwort #1 am: 08. März 2016, 21:25:24 »
Die Meldung ist doch korrekt, oder? In deinem System wird es kein Programm mit dem Namen test1 geben. 0 wird normalerweise zurückgegeben, wenn das Script fehlerfrei durchgelaufen ist. Das hat mit true und false eigentlich nix zu tun. Ist ja kein Bitstatus.

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 1470
  • Dankeschön: 282 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.19 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Bashscript (test Kommando)
« Antwort #2 am: 08. März 2016, 21:26:39 »
Hallo Jaob,
Code: Bash
  1. [ -x `which test1` ];
  2. echo "$?"
Wenn das Programm test1 nicht existiert, bekomme ich folgende Meldung:
which: no test1 in (/usr/local/sbin:...)Warum bekomme ich in dem Script den Rückgabewert 0, was ja so viel wie true bedeutet?
Weil Du den Test so schreiben solltest:
Code: Bash
  1. [ -x "$(which test1)" ]
Ohne die Anführungszeichen ergibt die Auswertung von `which test1` eine leere Zeichenkette, so daß der Test bei dir dann so aussieht:
Code: Bash
  1. [ -x ]
und das gibt 0.
Kannst Du leicht nachprüfen, wenn Du das der Reihe nach ausführst:
Code: Bash
  1. a=`which test1`
  2. echo $a

Viele Grüße gosia
"funktioniert nicht" ist keine brauchbare Fehlermeldung

Offline Jaob

  • Neuling
  • *
  • Beiträge: 4
  • Desktop: Xfce4
  • Skill: Anfänger
Re: Bashscript (test Kommando)
« Antwort #3 am: 08. März 2016, 22:16:40 »
Danke erstmal für eure Antworten! :)

@Pig of Destiny
Nein, -x soll überprüfen, ob es sich um ein ausführbares Programm handelt. Das müsste ja eig. false zurückgeben (laut info ist das 1).

@gosia
Ne, bei mir kommt die oben beschriebene Nachricht bei:
Code: Bash
  1. a=`which test1`
  2. echo $a
which: no test1 in (/usr/local/sbin:/usr/local/bin:/usr/bin:...)
Ich weiß, dass man das anders schreiben muss (wie z.b. [[ -x "$(which test1)" ]]), aber mich hat diese Zeile interessiert, weil ich das Ergebnis nicht verstehe :D

Offline Pig of Destiny

  • Held Mitglied
  • *****
  • Beiträge: 1383
  • Dankeschön: 125 mal
  • Desktop: Xfce
  • Grafikkarte: Intel Graphics
  • Grafikkartentreiber: free
  • Kernel: 4.16
  • Prozessor: Intel Celeron N3350
  • Skill: Durchschnitt
  • Zweig: Arch Linux
Re: Bashscript (test Kommando)
« Antwort #4 am: 08. März 2016, 22:33:01 »
Aber du hast doch bestimmt am Ende des Scripts irgendwo ein exit 0 stehen, oder?

Offline gosia

  • Held Mitglied
  • *****
  • Beiträge: 1470
  • Dankeschön: 282 mal
  • Desktop: Openbox + xfce
  • Grafikkarte: Intel HD 4000
  • Grafikkartentreiber: i915 (free)
  • Kernel: 4.19 Artix
  • Prozessor: Intel Core i5-3210M
  • Skill: Durchschnitt
  • Zweig: stable
Re: Bashscript (test Kommando)
« Antwort #5 am: 08. März 2016, 22:46:34 »
Hallo Jaob,
Ne, bei mir kommt die oben beschriebene Nachricht bei:
Code: Bash
  1. a=`which test1`
  2. echo $a
which: no test1 in (/usr/local/sbin:/usr/local/bin:/usr/bin:...)
Das which: no test1 in (/usr/local/sbin:/usr/local/bin:/usr/bin:...) ist doch nur die Fehlermeldung. a wird "nix" zugewiesen (bleibt sozusagen leer). Wird besser sichtbar, wenn Du das der Reihe nach ausführst:
gosia@smok ~ $ a=`which test1`
which: no test1 in (/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/share/backuppc/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/gosia/.gem/ruby/2.3.0/bin:/home/gosia/bin:/home/gosia/.gem/ruby/2.3.0/bin:/home/gosia/bin)
1 ✗ gosia@smok ~ $ echo $a

0 ✓ gosia@smok ~ $

Viele Grüße gosia
"funktioniert nicht" ist keine brauchbare Fehlermeldung

Offline Jaob

  • Neuling
  • *
  • Beiträge: 4
  • Desktop: Xfce4
  • Skill: Anfänger
Re: Bashscript (test Kommando)
« Antwort #6 am: 09. März 2016, 09:55:12 »
@gosia
Achsoo :D Das ist mir nie aufgefallen, weil ich die Zuweisung und die Ausgabe zusammen ausgeführt habe (bin noch ziemlich neu in Sachen bashscripting). Danke nochmal :)

Offline SpiritOfTux

  • Held Mitglied
  • *****
  • Beiträge: 1223
  • Dankeschön: 183 mal
    • https://twitter.com/SpiritOfTux
  • Desktop: KDE Plasma, Deepin
  • Grafikkarte: NVIDIA [GeForce GTX 1060] [GeForce GTX 560 Ti] [GeForce GT 635M]
  • Grafikkartentreiber: On: NB intel/nvidia, HTPC nvidia, PowerWorkStation nvidia
  • Kernel: 4.14.y LTS, 4.9.y LTS,
  • Prozessor: Notebook: Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
  • Skill: Fortgeschritten
  • Zweig: stable 17.1.y on PowerWorkStation, NB, HTPC, Desktop:s: Testing or Unstable only VM
Re: Bashscript (test Kommando)
« Antwort #7 am: 09. März 2016, 10:07:42 »
Das kleine Script mal aufgeblättert  ;)

Zitat
[
_____=======> check file types and compare values

            -x `which test1`
............_________________========> -x FILE      FILE exists and execute (or search) permission is granted

....................................................................... ]; ===> Commands separated  by  a ; are executed sequentially; the shell
                                                                                       waits for each command to terminate in turn.  The
                                                                                      return status is the exit status of the last command executed.

............................................................................. echo ===> display a line of text

......................................................................................... "$?" ===>    Echo the STRING(s) to standard output.


Schau mal in Bash Manuel ;)
Vielen Dank, dass du diesen Artikel bei uns gelesen hast!  Wir würden uns sehr freuen, wenn du diesen ebenfalls im folgenden Abschnitt bewerten würdest.(Danke sagen) 
Nach hilfreichen Antworten suchen: Manjaro Forum | Manjaro Wiki | Arch Wiki | Arch WiKi on NB/PC : sudo pacman -S arch-wiki-man https://github.com/greg-js/arch-wiki-man#readme