Nieuws:

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

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

Offline bart85

  • Lid
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?
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.
You can never make a system 100% secure unless you unplug the machine from all networks, turn it off, lock it in a safe, smother it in concrete and never use it.

Offline bart85

  • Lid
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.
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.
You can never make a system 100% secure unless you unplug the machine from all networks, turn it off, lock it in a safe, smother it in concrete and never use it.

Offline edehont

  • Lid
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
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

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.