Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Командная строка LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 98

Автор Шоттс Уильям

./trouble: строка 9: `else'

И снова сообщСниС ΠΎΠ± ошибкС ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° мСсто, располоТСнноС Π³ΠΎΡ€Π°Π·Π΄ΠΎ дальшС фактичСского мСста ошибки. Π—Π΄Π΅ΡΡŒ складываСтся ΠΎΡ‡Π΅Π½ΡŒ интСрСсная ситуация. Как Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, if ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ провСряСт ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ послСднСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² спискС. Π’ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΡ‹ Π·Π°Π΄ΡƒΠΌΠ°Π»ΠΈ список с СдинствСнной ΠΊΠΎΠΌΠ°Π½Β­Π΄ΠΎΠΉ [, которая являСтся синонимом ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ test. Команда [ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ всС, Ρ‡Ρ‚ΠΎ слСдуСт Π·Π° Π½Π΅ΠΉ, ΠΊΠ°ΠΊ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² β€” Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: $number, =, 1 ΠΈ ]. Π’ отсутствиС Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой Π² список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ слово then, Ρ‡Ρ‚ΠΎ синтаксичСски допустимо. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° echo Ρ‚Π°ΠΊΠΆΠ΅ допустима. Она интСрпрСтируСтся ΠΊΠ°ΠΊ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² спискС ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ if Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Π”Π°Π»Π΅Π΅ слСдуСт нСумСстноС здСсь слово else, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° распознаСт Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слово (слово, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ), Π° Π½Π΅ ΠΊΠ°ΠΊ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ смысл сообщСния ΠΎΠ± ошибкС.

НСпрСдвидСнная подстановка

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ лишь врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Иногда сцСнарий Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ошибок, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ ΠΈΠ·-Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° подстановки. Для дСмонстрации этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²Π΅Ρ€Π½Π΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой Π½Π° мСсто ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ number, присвоив Π΅ΠΉ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

#!/bin/bash

# trouble: сцСнарий для дСмонстрации распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок

number=

if [ $number = 1 ]; then

Β Β Β Β Β Β Β Β echo "Number is equal to 1."

else

Β Β Β Β Β Β Β Β echo "Number is not equal to 1."

fi

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сцСнарий послС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

[[email protected] ~]$ trouble

./trouble: строка 7: [: =: оТидаСтся использованиС ΡƒΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°

Number is not equal to 1.

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ довольно Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎΠ΅ сообщСниС, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π²Ρ‹Π²ΠΎΠ΄ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ echo. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² подстановкС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ number Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ test. ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

[ $number = 1 ]

ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ подстановки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ number пустым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ:

[ = 1 ]

получится нСдопустимый Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΈ командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° сгСнСрируСт сообщСниС ΠΎΠ± ошибкС. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ = являСтся Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ (ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Π΄Π²ΡƒΡ… ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ стороны), Π½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ отсутствуСт, поэтому ΠΊΠΎΠΌΠ°Π½Β­Π΄Π° test ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ (Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ -z). Π”Π°Π»Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ test Π²Π΅Ρ€Π½ΡƒΠ»Π° Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (ΠΈΠ·-Π·Π° ошибки), ΠΊΠΎΠΌΠ°Π½Π΄Π° if ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ echo.

Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ test:

[ "$number" = 1 ]

Π’Π΅ΠΏΠ΅Ρ€ΡŒ подстановка ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ:

[ "" = 1 ]

с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠšΠ°Π²Ρ‹Ρ‡ΠΊΠΈ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для прСдохранСния ΠΎΡ‚ пустых строк, Π½ΠΎ ΠΈ Π² Ρ‚ΠΎΠΌ случаС, Ссли пСрСмСнная содСрТит строку с нСсколькими словами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ имя Ρ„Π°ΠΉΠ»Π° со встроСнными ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ.

ЛогичСскиС ошибки

ЛогичСскиС ошибки, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ синтаксичСских, Π½Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сцСнария. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π²Ρ‹ Π½Π΅ Π΄ΠΎΠΆΠ΄Π΅Ρ‚Π΅ΡΡŒ, ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° этому β€” ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ. БущСствуСт бСсчислСнноС мноТСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… логичСских ошибок, Π½ΠΈΠΆΠ΅ пСрСчислСны Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ΠΈΡ… Π²ΠΈΠ΄Ρ‹, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² сцСнариях:

β€’ ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠžΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if/then/else ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Иногда Π»ΠΎΠ³ΠΈΠΊΠ° получаСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ вСсь Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ситуаций.

β€’ Ошибки «смСщСния Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†ΡƒΒ». ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² со счСтчиками ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ· Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ с 0, Π° Π½Π΅ с 1, Ρ‡Ρ‚ΠΎΠ±Ρ‹ счСт закончился Π² Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅. Ошибки этого Π²ΠΈΠ΄Π° приводят ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» выполняСт Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ большС ΠΈΠ»ΠΈ мСньшС, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡΡΡŒ соотвСтствСнно слишком ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΈΠ»ΠΈ слишком Ρ€Π°Π½ΠΎ.

β€’ НСпрСдвидСнныС ситуации. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ логичСских ошибок приводят ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сталкиваСтся с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ с ситуациСй, Π½Π΅ прСдусмотрСнными программистом. К Π½ΠΈΠΌ относятся нСпрСдвидСнная подстановка, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² случаС с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащими ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² нСсколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ.

Π—Π°Ρ‰ΠΈΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ ΠΎΠΏΠΈΡ€Π°Ρ‚ΡŒΡΡ Π½Π° допущСния, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠΎΠ΄Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… сцСнариСм. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ. БистСмный Π³ΠΎΡ€Π΅-администратор написал сцСнарий, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΡƒΡŽ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠΌ сСрвСрС. Π­Ρ‚ΠΎΡ‚ сцСнарий содСрТал ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π°:

cd $dir_name

rm *

Π’ самих строках Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ошибки, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ dir_name, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сущСствуСт. Но Ρ‡Ρ‚ΠΎ случится, Ссли это Π½Π΅ Ρ‚Π°ΠΊ? Π’ΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° cd ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ, сцСнарий ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Π΄Π°Π»Π΅ΠΊ ΠΎΡ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ! НСсчастный администратор ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΠ» массу Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° сСрвСрС ΠΈΠ·-Π·Π° этой логичСской ошибки.

Рассмотрим нСсколько способов ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ описанной Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ rm Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ успСха cd:

cd $dir_name && rm *

Π’ этом случаС, Ссли ΠΊΠΎΠΌΠ°Π½Π΄Π° cd ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ, ΠΊΠΎΠΌΠ°Π½Π΄Π° rm Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°. Π’Π°ΠΊ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Π½ΠΎ Π΅Ρ‰Π΅ остаСтся Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ отсутствия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ dir_name ΠΈΠ»ΠΈ хранСния Π² Π½Π΅ΠΉ пустого значСния, Ρ‡Ρ‚ΠΎ, бСзусловно, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² домашнСм ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ dir_name Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ содСрТит имя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°:

[[ -d $dir_name ]] && cd $dir_name && rm *

Π’ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ситуациях, ΠΊΠ°ΠΊ описанных Π²Ρ‹ΡˆΠ΅, Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сцСнария с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ сообщСния ΠΎΠ± ошибкС:

if [[ -d $dir_name ]]; then

Β Β Β Β Β Β Β Β if cd $dir_name; then

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β rm *

Β Β Β Β Β Β Β Β else

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β echo "cannot cd to '$dir_name'" >&2

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β exit 1

Β Β Β Β Β Β Β Β fi

else

Β Β Β Β Β Β Β Β echo "no such directory: '$dir_name'" >&2

Β Β Β Β Β Β Β Β exit 1

fi

Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ сущСствованиС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cd. Если какая-Ρ‚ΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, Π² стандартный Π²Ρ‹Π²ΠΎΠ΄ ошибок отправляСтся ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС ΠΈ сцСнарий Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ 1, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ошибкой.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π²ΠΎΠ΄Π°

Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ программирования: Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Π²ΠΎΠ΄, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Π±Ρ€Π°ΠΊΠΎΠ²ΠΊΡƒ Π²Π²ΠΎΠ΄Π° с Ρ†Π΅Π»ΡŒΡŽ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π½ΡƒΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ допустимыС Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅, ΠΊΠΎΠ³Π΄Π° обсуТдали ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ read. Π’Π°ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· сцСнариСв содСрТал ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню:

[[ $REPLY =~ ^[0-3]$ ]]

ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ Π΅ΡΡ‚ΡŒ функция ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

Когда я Π² студСнчСствС ΠΈΠ·ΡƒΡ‡Π°Π» ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΌΡƒΠ΄Ρ€Ρ‹ΠΉ профСссор ΡƒΡ‡ΠΈΠ» нас, Ρ‡Ρ‚ΠΎ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° опрСдСляСтся объСмом Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ. Если Π²Π°ΠΌ Π΄Π°Π½ΠΎ 5 ΠΌΠΈΠ½ΡƒΡ‚ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ устройства для уничтоТСния Π²ΠΎΠ·Π΄ΡƒΡˆΠ½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ, Π²Ρ‹ спроСктируСтС ΠΌΡƒΡ…ΠΎΠ±ΠΎΠΉΠΊΡƒ. А Ссли срок β€” 5 мСсяцСв, Π²Ρ‹ смоТСтС ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»Π°Π·Π΅Ρ€Π½ΡƒΡŽ систСму ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠ²ΠΎΠ·Π΄ΡƒΡˆΠ½ΠΎΠΉ ΠΎΠ±ΠΎΡ€ΠΎΠ½Ρ‹.

Π’ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ дСйствуСт ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях допустимо ΠΏΠΈΡΠ°Ρ‚ΡŒ сцСнарии Π½Π° ΡΠΊΠΎΡ€ΡƒΡŽ Ρ€ΡƒΠΊΡƒ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ программистом. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Ρ‚Π°ΠΊΠΈΡ… сцСнариях Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ довольно часто, ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ быстро, Π±Π΅Π· Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π»ΠΈΡˆΠ½ΠΈΡ… усилий. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ сцСнарии Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли сцСнарий ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для постоянного использования, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ снова ΠΈ снова для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Π°ΠΆΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ ΠΈΠ»ΠΈ мноТСством ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ слСдуСт ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ с большим Ρ‚Ρ‰Π°Π½ΠΈΠ΅ΠΌ.