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
- Ön “hiányzik
$
a var elől, amikor hívod, ahogy írtad, szó szerintvar
lesz. - 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 ]
. - Hiányzik egy szóköz a
!=
és0
(ez a hiba forrása!) -
!=
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 azbash
(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.