Bash-vlaggen gebaseerd op if-statements [duplicate]

Deze vraag heeft hier al antwoorden :

Reacties

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:


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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *