НаличСн Π΅ ShellCheck 0.9, статичСн Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π·Π° шСл скриптовС

ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π° Π΅ вСрсията Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ShellCheck 0.9, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° систСма Π·Π° статичСн Π°Π½Π°Π»ΠΈΠ· Π½Π° скриптовС Π½Π° shell, която ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² скриптовС, ΠΊΠ°Ρ‚ΠΎ сС Π²Π·Π΅ΠΌΠ°Ρ‚ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ характСристикитС Π½Π° bash, sh, ksh ΠΈ dash. ΠšΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ написан Π½Π° Haskell ΠΈ сС разпространява ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π· GPLv3. ΠžΡΠΈΠ³ΡƒΡ€Π΅Π½ΠΈ са ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅ с Vim, Emacs, VSCode, Sublime, Atom ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€Π°ΠΌΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ GCC-ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎ ΠΎΡ‚Ρ‡ΠΈΡ‚Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

НаличСн Π΅ ShellCheck 0.9, статичСн Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π·Π° шСл скриптовС

ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ Π½Π° синтактични Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΈΡ‚ΠΎ водят Π΄ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС, Ρ‚Π°ΠΊΠ° ΠΈ Π½Π° сСмантични ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ сС ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°, Π½ΠΎ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° скрипта. ΠΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ ΡΡŠΡ‰ΠΎ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π° тСсни мСста, Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ ΠΊΠ»ΠΎΠΏΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π°Ρ‚ Π΄ΠΎ ΠΎΡ‚ΠΊΠ°Π·ΠΈ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ обстоятСлства.

Π‘Ρ€Π΅Π΄ класовСтС ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с избягванСто Π½Π° спСциални символи ΠΈ Ρ€Π°ΠΌΠΊΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ Π² ΠΊΠ°Π²ΠΈΡ‡ΠΊΠΈ, Π³Ρ€Π΅ΡˆΠΊΠΈ Π² условни ΠΈΠ·Ρ€Π°Π·ΠΈ, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Π΄Π°Ρ‚ΠΈ ΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈ синтактични Π³Ρ€Π΅ΡˆΠΊΠΈ Π·Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‰ΠΈ. НапримСр липсата Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ ΠΏΡ€ΠΈ сравняванС Π½Π° β€ž[[ $foo==0 ]]β€œ, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΈ β€žvar = 42β€œ ΠΈΠ»ΠΈ посочванСто Π½Π° символа $ ΠΏΡ€ΠΈ присвояванС Π½Π° β€ž$foo=42β€œ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π±Π΅Π· ΠΊΠ°Π²ΠΈΡ‡ΠΊΠΈ β€œecho $1”, индикацията Π·Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΈ скоби Π² "tr -cd '[a-zA-Z0-9]'",

ОсвСн Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠΈ Π·Π° подобряванС Π½Π° стила Π½Π° ΠΊΠΎΠ΄Π°, Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ с прСносимостта ΠΈ повишаванС Π½Π° надСТдността Π½Π° скриптовСтС. НапримСр, вмСсто β€œecho $[1+2]” Ρ‰Π΅ бъдС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ β€œ$((..))”, конструкцията β€œrm -rf β€œ$STEAMROOT/”*' Ρ‰Π΅ бъдС ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½Π° ΠΊΠ°Ρ‚ΠΎ опасна ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ Π³Π»Π°Π²Π½Π°Ρ‚Π° дирСктория, Π°ΠΊΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½Π΅ Π΅ попълнСна $STEAMROOT, ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° "echo {1..10}" Ρ‰Π΅ бъдС ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½ΠΎ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎ с dash ΠΈ sh.

Π’ Π½ΠΎΠ²Π°Ρ‚Π° вСрсия:

  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·Ρ€Π°Π·ΠΈ ΠΊΠ°Ρ‚ΠΎ β€žlocal readonly fooβ€œ.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ към β€žΠ΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° x=1 y=$xβ€œ.
  • Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π°ΠΊΠΎ $? ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° сС Π·Π° ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° echo, printf, [ ], [[ ]] ΠΈ test.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ° Π·Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° ((..))inarray[((idx))]=val.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ° Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° Π΄Π²ΠΎΠΉΠ½ΠΈ скоби Π² Π°Ρ€ΠΈΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‡Π½ΠΈ контСксти.
  • Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ° Π·Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° скобитС Π² ΠΈΠ·Ρ€Π°Π·Π° a[(x+1)]=val.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€