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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Командная строка Linux. ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 81

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

Please Select:

1. Display System Information

2. Display Disk Space

3. Display Home Space Utilization

0. Quit

_EOF_

read -p "Enter selection [0-3] > "

if [[ $REPLY =~ ^[0-3]$ ]]; then

if [[ $REPLY == 1 ]]; then

echo "Hostname: $HOSTNAME"

uptime

sleep $DELAY

continue

fi

if [[ $REPLY == 2 ]]; then

df -h

sleep $DELAY

continue

fi

if [[ $REPLY == 3 ]]; then

if [[ $(id -u) -eq 0 ]]; then

echo "Home Space Utilization (All Users)"

du -sh /home/*

else

echo "Home Space Utilization ($USER)"

du -sh $HOME

fi

sleep $DELAY

continue

fi

if [[ $REPLY == 0 ]]; then

break

fi

else

echo "Invalid entry."

sleep $DELAY

fi

done

echo "Program terminated."

Π’ этой вСрсии сцСнария ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ бСсконСчный Ρ†ΠΈΠΊΠ» (Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ сам ΠΏΠΎ сСбС), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π° while провСряСт ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ true. Π’Π°ΠΊ ΠΊΠ°ΠΊ true всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ 0, Ρ†ΠΈΠΊΠ» Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌ Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² сцСнариях. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ†ΠΈΠΊΠ» Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ сам ΠΏΠΎ сСбС, программист Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ этом сцСнарии Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ break, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΏΡƒΠ½ΠΊΡ‚ 0. Π’ ΠΊΠΎΠ½Π΅Ρ† Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° continue, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария. ВстрСтив ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ continue, сцСнарий ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³Π½Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ Π² Ρ†ΠΈΠΊΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π°. НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Ρ€Π°Π» ΠΏΡƒΠ½ΠΊΡ‚ 1, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

until


Команда until ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° while, Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» Π½Π΅ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π¦ΠΈΠΊΠ» until продолТаСтся, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ 0. Π’ сцСнарии while-count Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ count мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ 5. Π’ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, пСрСписав сцСнарий с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ until:

#!/bin/bash

# until-count: Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ чисСл

count=1

until [ $count -gt 5 ]; do

echo $count

count=$((count + 1))

done

echo "Finished."

Π‘ условным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ $count -gt 5 ΠΊΠΎΠΌΠ°Π½Π΄Π° until Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ†ΠΈΠΊΠ» Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ while ΠΈ until ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ случаС условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ†ΠΈΠΊΠ»Π°Ρ…


ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ while ΠΈ until ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ со стандартного Π²Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ содСрТимоС Ρ„Π°ΠΉΠ»Π° distros.txt, созданного Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²:

#!/bin/bash

# while-read: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ строк ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

while read distro version release; do

printf "Distro: %s\tVersion: %s\tReleased: %s\n" \

$distro \

$version \

$release

done < distros.txt

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π² Ρ†ΠΈΠΊΠ», ΠΌΡ‹ помСстили ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСнаправлСния послС инструкции done. Π¦ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ поля ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ read. ПослС Π²Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΊΠΎΠΌΠ°Π½Π΄Π° read Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ 0, ΠΏΠΎΠΊΠ° Π½Π΅ достигнСт ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ½Π° Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΈ Ρ†ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π¦ΠΈΠΊΠ» ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°Ρ…:

#!/bin/bash

# while-read2: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ строк ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

sort -k 1,1 -k 2n distros.txt | while read distro version release; do

printf "Distro: %s\tVersion: %s\tReleased: %s\n" \

$distro \

$version \

$release

done

Π—Π΄Π΅ΡΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ sort пСрСдаСтся Π½Π° стандартный Π²Π²ΠΎΠ΄ Ρ†ΠΈΠΊΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ тСкста Π½Π° экран. Но Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ выполняСт Ρ†ΠΈΠΊΠ» Π² ΠΏΠΎΠ΄Β­ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅, поэтому послС Π΅Π³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, созданныС Π² Ρ†ΠΈΠΊΠ»Π΅, Π±ΡƒΠ΄ΡƒΡ‚ потСряны.

Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅


ПослС знакомства с Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ ΠΈ Ρ€Π°Π½Π΅Π΅ прСдставлСнными ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ вСтвлСния, функциями ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ прСдставлСниС ΠΎΠ± основных способах управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ выполнСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π’ арсСналС bash имССтся Π΅Ρ‰Π΅ мноТСство Ρ…ΠΈΡ‚Ρ€Ρ‹Ρ… Ρ‚Ρ€ΡŽΠΊΠΎΠ², Π½ΠΎ всС ΠΎΠ½ΠΈ основаны Π½Π° этих простых идСях.

30. Поиск ΠΈ устранСниС ошибок


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

БинтаксичСскиС ошибки


Один ΠΈΠ· самых распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок β€” синтаксичСскиС ошибки. БинтаксичСскиС ошибки Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π²Π²ΠΎΠ΄Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта с Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ синтаксиса ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ. Π§Π°Ρ‰Π΅ всСго эти ошибки Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚ΠΊΠ°Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΎΡ‚ выполнСния сцСнария.

Для дСмонстрации распространСнных Π²ΠΈΠ΄ΠΎΠ² ошибок Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… обсуТдСниях ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сцСнарий:

#!/bin/bash

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

number=1

if [ $number = 1 ]; then

echo "Number is equal to 1."

else

echo "Number is not equal to 1."

fi

Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ своСм Π²ΠΈΠ΄Π΅ сцСнарий выполняСтся Π±Π΅Π· ошибок:

[ [email protected] ~]$ trouble

Number is equal to 1.

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ


Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ сцСнарий, ΡƒΠ΄Π°Π»ΠΈΠ² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΡƒ Π² ΠΊΠΎΠ½Ρ†Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ echo:

#!/bin/bash

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

number=1

if [ $number = 1 ]; then

echo "Number is equal to 1.

else

echo "Number is not equal to 1."

fi

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠ· этого ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

[ [email protected] ~]$ trouble

./trouble: строка 10: Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΉ EOF ΠΏΡ€ΠΈ поискС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ `"'

./trouble: строка 13: ошибка синтаксиса: Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°

Командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° сгСнСрировала Π΄Π²Π° сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° строк Π² сообщСниях Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π½ΠΎΠΌΠ΅Ρ€Ρƒ строки, Π³Π΄Π΅ отсутствуСт ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°. ΠŸΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΌΠΎΠΆΠ½ΠΎ, мыслСнно послСдовав Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ послС ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. bash ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ поиск Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈ Π½Π°ΠΉΠ΄Π΅Ρ‚ Π΅Π΅ сразу Π·Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ echo. ПослС этого командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° bash ΠΎΡ‡Π΅Π½ΡŒ удивится, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ² Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ синтаксиса ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ if, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ инструкция fi Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ окаТСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ строки Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… (Π½Π΅Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ).

Найти Ρ‚Π°ΠΊΠΈΠ΅ ошибки Π² Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… сцСнариях ΠΏΠΎΡ€ΠΎΠΉ ΠΎΡ‡Π΅Π½ΡŒ слоТно. Π₯ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² этом случаС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ с подсвСткой синтаксиса. Если Π² систСмС установлСна полная вСрсия Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° vim, подсвСтка синтаксиса Π² Π½Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

:syntax on

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ лСксСмы


Другая частая ошибка β€” отсутствиС Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ элСмСнта Π² составной ΠΊΠΎΠΌΠ°Π½Π΄Π΅, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ if ΠΈΠ»ΠΈ while. ВзглянитС, Ρ‡Ρ‚ΠΎ получится, Ссли ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ условия Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ if.

#!/bin/bash

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

number=1

if [ $number = 1 ] then

echo "Number is equal to 1."

else

echo "Number is not equal to 1."

fi

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сцСнарий ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

[ [email protected] ~]$ trouble

./trouble: строка 9: ошибка синтаксиса ΠΎΠΊΠΎΠ»ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΉ лСксСмы `else'

./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.