Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Error in Bash script. Wat gaat er fout?  (gelezen 510 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Error in Bash script. Wat gaat er fout?
« Gepost op: 2015/11/24, 10:57:20 »
Het volgende script geeft onderstaande error aan:
$ ./path.sh
./path.sh: line 8: [: too many arguments
#!/bin/bash
#
# Programma dat alle directory's die in $PATH staan op een nieuwe regel weergeeft.

IFS=:
string=$PATH

while [ -n $string ]
do
echo "${string%%$IFS*}"
string="${string#*$IFS}"
done

Hoe los ik dit op?

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: Error in Bash script. Wat gaat er fout?
« Reactie #1 Gepost op: 2015/11/24, 11:42:41 »
Het script wil uitvoeren  als ik de regel 8 vervang als hieronder:

while [[ -n $string ]]
Het probleem is dat het programma niet stopt. De output is goed totdat de laatste directory word weergeven. Het blijft deze laatste directory herhalen. Het probleem is dat dan de pattern matching operator deze laatste er niet uit haalt.

Offline edehont

  • Lid
  • Steunpunt: Nee
Re: Error in Bash script. Wat gaat er fout?
« Reactie #2 Gepost op: 2015/11/24, 12:31:12 »
1: de variabele in een test moet je altijd tussen aanhalingstekens zetten, want als hij bijvoorbeeld leeg is wordt de variabele vervangen door helemaal NIETS en while [  -n  ] is iets waar bash zich in verslikt. In jouw geval ziet bash een heleboel waarden, omdat je de IFS op : hebt gezet. Hij splitst $string dus op in allemaal velden terwijl hij na de -n maar 1 ding verwacht.

2: IFS is een interne variabele. Door die een waarde te geven verander je de manier waarop bash met velden omgaat. Het is dus niet de bedoeling dat je zelf verder met die variabele gaat werken. Je kunt dan simpelweg zoiets doen:

IFS=:

for i in $PATH
    do echo $i
done
Groeten,
Eric

Offline edehont

  • Lid
  • Steunpunt: Nee
Re: Error in Bash script. Wat gaat er fout?
« Reactie #3 Gepost op: 2015/11/24, 12:35:33 »
PS: je oorspronkelijke scriptje blijft loopen op het laatste item in path, omdat je laatste assignment geen ':' meer kan vinden. Bash geeft dan gewoon de hele variabele terug: string=$string, en dan blijf je eeuwig (nou ja, eeuwig...) met de laatste entry zitten.

PS2: de while met dubbele haken is ietsje slimmer en snapt dat de test loopt tot hij de ]] tegenkomt.
« Laatst bewerkt op: 2015/11/24, 12:37:42 door edehont »
Groeten,
Eric

Offline grizzler

  • Lid
  • Steunpunt: Nee
Re: Error in Bash script. Wat gaat er fout?
« Reactie #4 Gepost op: 2015/11/24, 16:32:56 »
Waarom zou je IFS Ć¼berhaupt wijzigen?

Het oorspronkelijke scriptje zou er ook zo uit kunnen zien:string=$PATH:

while [ $string ]
do
    echo ${string%%:*}
    string=${string#*:}
done
De extra dubbele punt achter $PATH bij de toewijzing aan string zorgt ervoor dat string uiteindelijk wel leeg wordt, zodat de lus wordt beƫindigd.

Als je verwacht dat PATH spaties bevat (wat normaal gesproken niet zo zal zijn), moet je aanhalingstekens gebruiken in de toewijzing en de test.