voorwaardelijke binaire operator verwacht

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

  1. Jij “re missing $ voor var wanneer je het aanroept, zoals je het hebt geschreven, zal het letterlijk var zijn.
  2. 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.
  3. U mist een spatie tussen != en 0 (dit is de oorzaak van de fout!)
  4. != is een stringvergelijkingsoperator , hoewel het in uw voorbeeld zou kunnen werken, wilt u -ne gebruiken om gehele getallen te vergelijken.

Maak gebruik van shellcheck .

Reacties

  • Opmerking t hat (( 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.
  • Bedankt St é phane voor je inzichten. Vindt u [[ "$var" -ne 0 ]] onveilig? Hoe zit het met hetzelfde zonder aanhalingstekens? Dus wat zou volgens jou de voorkeur moeten hebben?
  • In [[ $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 in bash (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 bevat 00 aangezien het ' een stringvergelijking is.

Geef een reactie

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