Reacties
- Behandeld in Maar wat als …?
Antwoord
Je kunt het commando bouwen in een array:
#!/bin/bash var=ON cmd=( /home/username/myscript ) # create array with one element if [ "$var" == "ON" ]; then cmd+=( -a ) # append to the array fi cmd+=( -b 76 ) # append two elements
En voer het vervolgens uit met:
"${cmd[@]}"
Let op de aanhalingstekens rond het laatste deel, en de haakjes rond de bovenstaande opdrachten. De syntaxis is lelijk, maar het werkt ondanks argumenten die witruimte en dergelijke bevatten. (Gebruik aanhalingstekens om argumenten met spaties toe te voegen, bijv. cmd+=("foo bar")
)
Gerelateerd, met minder lelijke methoden en manieren waarop ze kunnen falen:
- Hoe kunnen we een commando uitvoeren dat in een variabele is opgeslagen?
- Shell gebruiken variabelen voor commando-opties
In eenvoudige gevallen, zoals dat ene optionele argument hier, zou je weg kunnen komen met de alternatieve waarde-uitbreiding:
var=x myscript ${var:+"-a"} -b 76
Hier ${var:+foo}
voegt foo
in als var
is niet leeg (dus var=ON
, var=FALSE
, var=x
zouden het allemaal invoegen) , en niets als het leeg of niet ingesteld is (var=
, of unset var
). Wees voorzichtig met de gebruikelijke problemen met citaten.
Opmerkingen
- +1 Deze syntaxis is lelijk en complexer, maar de oplossing is schaalbaar, terwijl mijn oplossing is eenvoudiger, maar zou snel veranderen in een puinhoop als er meer vlaggencombinaties zouden worden overwogen.
- Bedankt! Precies wat ik ' m zoek!
- @theta, voegde een andere optie toe, een minder lelijk en meer vatbaar voor rommelig worden als deze wordt uitgebreid.
Antwoord
Als ik je goed begrijp:
var=ON if [ "$var" = "ON" ]; then /home/username/myscript -a -b 76 else /home/username/myscript -b 76 fi