var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Hvorfor får jeg «betinget binær operatør forventet». Jeg søkte allerede og. I. ser at [[]] er en testuttalelse, men hvorfor ville det ikke fungere?
Svar
- Du «mangler
$foran var når du kaller det, som du skrev det, vil det være bokstavelig taltvar. - Vurder mulige sårbarheter i skriptet ditt når du bruker
[[ ... ]]eller(( ... ))sammen med variabler du ikke kan kontrollere. I ditt tilfelle kan det være bedre å bruke[ "$var" -ne 0 ]. - Du mangler et mellomrom mellom
!=og0(dette er kilden til feilen!) -
!=er en strengesammenligningsoperatør , mens det kanskje fungerer i eksemplet ditt, vil du bruke-netil å sammenligne heltall.
Bruk shellcheck .
Kommentarer
- Merk t hatt
(( var !=0 ))vil også fungere her, men som[[ "$var" -ne 0 ]]ville være et vilkårlig sårbarhet for kommandainjeksjon hvis arten av utdataene til kommandoen som fanges er ikke under din kontroll. - Takk St é phane for din innsikt. Anser du
[[ "$var" -ne 0 ]]som utrygg? Hva med det samme uten sitater? Så hva synes du bør foretrekkes? - I
[[ $var -ne 0 ]](med eller uten anførselstegn, er anførselstegn ikke nødvendig i dette spesielle tilfellet) eller(( var!=0 )), innholdet i$varblir evaluert som et aritmetisk uttrykk og dårlige ting kan skje da .[ "$var" -ne 0 ](sitatene er nødvendige her da[er en vanlig kommando) er trygt ibash(men ikke alle andre skall), da$varbare tolkes som et desimaltall.[ "$var" != 0 ](eller[[ $var != 0 ]]kshism) er også trygt, men vil være sant hvis$varinneholder00som det ' en streng sammenligning.