var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi
Waarom krijg ik “voorwaardelijke binaire operator verwacht”. Ik heb al gezocht en. Ik zie dat [[]] een testverklaring is, maar waarom zou het niet werken?
Answer
- Jij “re missing
$
voor var wanneer je het aanroept, zoals je het hebt geschreven, zal het letterlijkvar
zijn. - Overweeg mogelijke kwetsbaarheden van uw script wanneer u
[[ ... ]]
of(( ... ))
samen met variabelen die u niet kunt controleren. In uw geval is het misschien beter om[ "$var" -ne 0 ]
te gebruiken. - U mist een spatie tussen
!=
en0
(dit is de oorzaak van de fout!) -
!=
is een stringvergelijkingsoperator , hoewel het in uw voorbeeld zou kunnen werken, wilt u-ne
gebruiken om gehele getallen te vergelijken.
Maak gebruik van shellcheck .
(( var !=0 ))
zou hier ook werken, maar zoals[[ "$var" -ne 0 ]]
zou een willekeurige kwetsbaarheid voor commando-injectie zijn als de aard van de uitvoer van het commando dat wordt vastgelegd staat niet onder jouw controle.[[ "$var" -ne 0 ]]
onveilig? Hoe zit het met hetzelfde zonder aanhalingstekens? Dus wat zou volgens jou de voorkeur moeten hebben?[[ $var -ne 0 ]]
(met of zonder de aanhalingstekens, de aanhalingstekens zijn in dit specifieke geval niet nodig) of(( var!=0 ))
, de inhoud van$var
wordt geëvalueerd als een rekenkundige uitdrukking en kunnen er slechte dingen gebeuren .[ "$var" -ne 0 ]
(de aanhalingstekens zijn hier nodig omdat[
een gewoon commando is) is veilig inbash
(maar niet alle andere shells), aangezien$var
alleen wordt geïnterpreteerd als een decimaal geheel getal.[ "$var" != 0 ]
(of het[[ $var != 0 ]]
kshism) is ook veilig, maar zou true retourneren als$var
bevat00
aangezien het ' een stringvergelijking is.