# [gelöst] Shell Script - Problem mit Strings und if Bedingung

## Fijoldar

Hallo,

ich scheitere gerade an einem ziemlich einfachen Shell Script.

```
#!/bin/bash

s="$(xset q | grep "DPMS is")"

if [ "$s" == "DPMS is Enabled" ]

    then

        status="on"

    else

        status="off"

fi

echo $status

```

Der Teil mit dem "if" funktioniert leider nicht wie ich mir das wünsche. Die Bedingung ist nie erfüllt, obwohl sie es eigentlich sein sollte. Kann es sein, dass es daran liegt, dass der String Leerzeichen beinhaltet? Kann man das dann überhaupt so machen oder gibt es da einen anderen Weg? Wäre toll, wenn mir da jemand kurz einen Schubs in die richtige Richtung geben könnte.Last edited by Fijoldar on Tue Apr 01, 2014 4:15 pm; edited 1 time in total

----------

## ChrisJumper

Ein kleiner Tipp.  Das in den Eckigen Klammern ist ein indirekter Aufruf von test, schau dir mal

```
 $ man test
```

an. Heute nur die Kurzform weil nur auf dem Sprung bin.

----------

## py-ro

Ich wette da sind zusätzliche Leerzeichen im String, zumindest wenn ich mir die xset -q Ausgabe bei mir ansehe, aber hübscher wäre es wohl so:

```
if xset -q | grep "DPMS is Enabled" > /dev/null

then

  status="on"

else

  status="off"

fi

echo $status
```

Kommt mit ein paar Subshells weniger aus.

----------

## Fijoldar

Danke! Das funktioniert prima. Das mit den zusätzlichen Leerzeichen hatte ich auch erst in Verdacht, aber ich habe mir extra mal die Variable ausgeben lassen und da ist kein zusätzliches Leerzeichen zu erkennen.

----------

## Christian99

EDIT: innerhlab von subshells ist escapen nicht nötig anscheinend. wieder was gelernt.

ich glaube das problem ist hier:

```
s="$(xset q | grep "DPMS is")" 
```

du verwendest geschachtelte anführungszeichen. da musst du die inneren escapen, also

```
s="$(xset q | grep \"DPMS is\")" 
```

 so.

sonst macht er die Anführungszeichen schon zu früh zu.

kannst das auch mit einem "echo $s" kontrollieren.

----------

## Fijoldar

Es gab ein Problem mit meiner Kontrolle. Ich hab mir nur echo $s ausgeben lassen und da waren natürlich keine Leerzeichen zu sehen. Wenn ich allerdings echo "$s" ausgeben lasse, erscheinen da tatsächlich vor dem String 2 Leerzeichen, die den Verdacht von py-ro bestätigen und natürlich zu einem unerwünschten Ergebnis führen.

Um die Leerzeichenproblematik zu umgehen, habe ich nun folgendes gemacht

```
#!/bin/bash

s="$(xset q | grep "DPMS is")"

if [[ $s == *Enabled* ]]

    then

        status="on"

    else

        status="off"

fi

echo $status
```

Das funktioniert nun. Das Skript von py-ro ist allerdings eleganter.

Mal schauen, ob ich das ganze irgendwie in meine i3status bar integrieren kann.

----------

## toralf

 *Fijoldar wrote:*   

> Es gab ein Problem mit meiner Kontrolle. Ich hab mir nur echo $s ausgeben lassen und da waren natürlich keine Leerzeichen zu sehen. Wenn ich allerdings echo "$s" ausgeben lasse, erscheinen da tatsächlich vor dem String 2 Leerzeichen, die den Verdacht von py-ro bestätigen und natürlich zu einem unerwünschten Ergebnis führen.
> 
> Um die Leerzeichenproblematik zu umgehen, habe ich nun folgendes gemacht
> 
> ```
> ...

 Genau, und zwar exakt solange, wie Du keine Datei mit dem Namen "maiuwauwauiaEnableduswusf" im selben Verzeichnis wie das Script hast !

----------

## Fijoldar

@toralf: Könntest du das bitte etwas erläutern? Ich verstehe nicht so wirklich, worauf du hinaus willst. Ich habe den Fall einfach mal durchgespielt und eine Datei mit diesem Namen erstellt. Das hat nichts an der Funktionalität geändert. Ich wüsste auch nicht wieso  :Confused: 

----------

## toralf

 *Fijoldar wrote:*   

> @toralf: Könntest du das bitte etwas erläutern? Ich verstehe nicht so wirklich, worauf du hinaus willst. Ich habe den Fall einfach mal durchgespielt und eine Datei mit diesem Namen erstellt. Das hat nichts an der Funktionalität geändert. Ich wüsste auch nicht wieso 

 Ick, ich hätte schwören können, daß die Shell substituiert :

```
tfoerste@n22 ~/tmp $ ls *Enabled*

maiuwauwauiaEnableduswusf
```

, tut sie aber nicht auf Grund der doppelten eckigen Klammern. Mit einfachen Klammern hingegen würde genau das passieren :

```
~/tmp $ head -n 3 x.sh

#!/bin/sh

set -x

tfoerste@n22 ~/tmp $ ./x.sh

++ xset q

++ grep 'DPMS is'

+ s='  DPMS is Disabled'

+ '[' DPMS is Disabled == maiuwauwauiaEnableduswusf ']'

./x.sh: line 6: [: too many arguments

+ status=off

+ echo off

off

```

----------

## 3PO

Warum nicht einfach: 

```
xset q -d :0 |grep DPMS |grep -v : |awk '{print  $3 }'
```

----------

