<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status" >
Denna fråga har redan svar här :
Kommentarer
- Täckt av Men vad händer om …?
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å:
- Hur kan vi köra ett kommando som är lagrat i en variabel?
- Med hjälp av skal variabler för kommandoalternativ
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