feltételes bináris operátor várható

var="$(command1 -l "$var2" -c "command2|grep -c "search"")" if [[ var !=0 ]]; then fi 

Miért kapok “feltételes bináris operátort”? Kerestem már és. I. látom, hogy a [[]] egy teszt állítás, de miért nem működik?

Válasz

  1. Ön “hiányzik $ a var elől, amikor hívod, ahogy írtad, szó szerint var lesz.
  2. Vegye figyelembe a szkript lehetséges sérülékenységeit a [[ ... ]] vagy a (( ... )) olyan változókkal együtt, amelyeket nem lehet ellenőrizni. Esetében jobb lehet, ha a következőt használja: [ "$var" -ne 0 ].
  3. Hiányzik egy szóköz a != és 0 (ez a hiba forrása!)
  4. != egy karakterlánc-összehasonlító operátor , míg a példádban működhet, az -ne használatával egész számokat akarsz összehasonlítani.

Használja a shellcheck elemet.

Megjegyzések

  • Megjegyzés t A hat (( var !=0 )) itt is működne, de az [[ "$var" -ne 0 ]] -hez hasonlóan önkényes parancsinjekciós sebezhetőség lenne, ha a rögzített parancs kimenetének jellege nincs az ön irányítása alatt.
  • Köszönet St é phane-nek a betekintésért. Nem tartja biztonságosnak az [[ "$var" -ne 0 ]] alkalmazást? Mi a helyzet ugyanazokkal idézőjelek nélkül? Tehát mit gondolsz előnyben?
  • [[ $var -ne 0 ]] (idézőjelekkel vagy anélkül, az idézőjelek ebben az esetben nem szükségesek) vagy (( var!=0 )), az $var tartalmát aritmetikai kifejezésekként értékelik, és akkor rossz dolgok történhetnek . [ "$var" -ne 0 ] (az itt szükséges idézőjelek, mivel [ egy közönséges parancs) biztonságos az bash (de nem az összes többi héj), mivel az $var -et csak tizedes egész számként értelmezzük. A [ "$var" != 0 ] (vagy a [[ $var != 0 ]] kshism) is biztonságos, de igaz lenne, ha $var 00 -t tartalmaz, mivel ' a karakterlánc-összehasonlítást tartalmazza.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük