Bash-flaggor baserade på if-uttalanden [duplicera]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status" >

Denna fråga har redan svar här :

Kommentarer

Svar

Du kan bygga kommandot i en matris:

#!/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 

Och kör den sedan med:

"${cmd[@]}" 

Notera citaten runt den sista delen och parentesen runt uppdragen ovan. Syntaxen är ful, men den fungerar inför argument som innehåller vitt utrymme och sådant. (Använd citat för att lägga till argument med mellanslag, t.ex. cmd+=("foo bar"))

Relaterade, med mindre fula metoder och sätt de kan misslyckas på:


I enkla fall, som det valfria argumentet här, kan du komma undan med den alternativa värdeutvidgningen:

var=x myscript ${var:+"-a"} -b 76 

Här infogar ${var:+foo} foo om var är inte tomt (så var=ON, var=FALSE, var=x skulle alla infoga det) , och ingenting om den är tom eller avmarkerad (var= eller unset var). Var försiktig med vanliga citatfrågor.

Kommentarer

  • +1 Den här syntaxen är ful och den är mer komplex, men lösningen är skalbar, medan min lösning är enklare men skulle snabbt utvecklas till en röra om fler flaggkombinationer skulle övervägas.
  • Tack! Exakt vad jag ' jag letar efter!
  • @theta, lade till ett annat alternativ, ett mindre ful och mer benägna att bli rörigt om det expanderades.

Svar

Om jag förstår dig rätt:

var=ON if [ "$var" = "ON" ]; then /home/username/myscript -a -b 76 else /home/username/myscript -b 76 fi 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *