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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 20

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ

Π”Π°Π½Π½Ρ‹ΠΉ сцСнарий исправляСт Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π΄Π΅Ρ„Π΅ΠΊΡ‚, Π° Π±ΠΎΠ»Π΅Π΅ тонкая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° остаСтся Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ. ЗапуститС Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ сцСнария, Π½ΠΎ вмСсто ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° вопрос просто Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter> (ΠΈΠ»ΠΈ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ… ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Return>). Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС:

[: =: unary operator expected

Π§Ρ‚ΠΎ ΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ? ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°

if
. Когда ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ»Π°ΡΡŒ пСрСмСнная
timeofday
, ΠΎΠ½Π° состояла ΠΈΠ· пустой строки. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Π΅Ρ‚Π²ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°
if
выглядСла ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

<i>if [ = &quot;yes&quot; ]</i>

ΠΈ Π½Π΅ прСдставляла собой Π²Π΅Ρ€Π½ΠΎΠ΅ условиС. Π’ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ этого слСдуСт Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ:

<i>if [ &quot;$timeofday&quot; = &quot;yes&quot; ]</i>

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с пустой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ:

<i>if [ &quot;&quot; = &quot;yes&quot; ]</i>

Новый сцСнарий Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

#!/bin/sh

echo &quot;Is it morning? Please answer yes or no &quot;

read timeofday

<i>if [ &quot;$timeofday&quot; = &quot;yes&quot; ]</i>

then

Β echo &quot;Good morning&quot;

elif [ &quot;$timeofday&quot; = &quot;no&quot; ]; then

Β echo &quot;Good afternoon&quot;

else

<i>Β echo &quot;Sorry, $timeofday not recognized. Enter yes or no &quot;</i>

Β exit 1

fi

exit 0

Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ бСзопасСн, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос просто Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π°

echo
ΡƒΠ΄Π°Π»ΠΈΠ»Π° Π½ΠΎΠ²ΡƒΡŽ строку Π² ΠΊΠΎΠ½Ρ†Π΅, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΎ пСрСносимый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
printf
(см. Ρ€Π°Π·Π΄. "printf" Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅) вмСсто ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
echo
. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°Ρ… примСняСтся ΠΊΠΎΠΌΠ°Π½Π΄Π°
echo -Π΅
, Π½ΠΎ ΠΎΠ½Π° поддСрТиваСтся Π½Π΅ всСми систСмами. Π’ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ bash для Π·Π°ΠΏΡ€Π΅Ρ‚Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку допускаСтся ΠΊΠΎΠΌΠ°Π½Π΄Π°
echo -n
, поэтому, Ссли Π²Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ придСтся Ρ‚Ρ€ΡƒΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ bash, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

echo -n &quot;Is it morning? Please answer yes or no: &quot;

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ формируСтся Π·Π°Π·ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π΄ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² этом случаС выглядит Ρ‡Π΅Ρ‚Ρ‡Π΅.

for

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠΉΡ‚Π΅ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ

for
для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅ ряда Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой любоС мноТСство строк. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ просто пСрСчислСны Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ Ρ‡Π°Ρ‰Π΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ подстановки ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ².

Бинтаксис этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° прост:

<b>for</b> <i>пСрСмСнная </i><b>in</b> <i>значСния</i>

<b>do</b>

<i>Β ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹</i>

<b>done</b>

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ упраТнСния 2.4 ΠΈ 2.5.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2.4. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°
for
ΠΊ фиксированным строкам

Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ значСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдставлСны Π² Π²ΠΈΠ΄Π΅ строк, поэтому ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сцСнарий:

#!/bin/sh

for foo in bar fud 43

do

Β echo $foo

done

exit 0

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

bar

fud

43

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку с

for foo in bar fud 43
Π½Π°
for foo in &quot;bar fud 43&quot;
? НапоминаСм, Ρ‡Ρ‚ΠΎ вставка ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ заставляСт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ находится ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, Π΅Π΄ΠΈΠ½ΠΎΠΉ строкой. Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов сохранСния ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создаСтся пСрСмСнная

foo
ΠΈ Π΅ΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π°
for
ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ значСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° считаСт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ строковыми, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ строку 43 Ρ‚Π°ΠΊ ΠΆΠ΅ допустимо, ΠΊΠ°ΠΊ ΠΈ строку
fud
.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2.5. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°
for
с мСтасимволами

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Ρ†ΠΈΠΊΠ»

for
ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ вмСстС с мСтасимволами ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠ°ΠΌΠΈ подстановки для ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ мСтасимвола для строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ прСдоставлСниС ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ возмоТности ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ всС значСния Π½Π° этапС выполнСния.

Π’Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ этот ΠΏΡ€ΠΈΠ΅ΠΌ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ first. Π’ сцСнарии ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΈΡΡŒ срСдства подстановки ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ β€” символ

*
для подстановки ΠΈΠΌΠ΅Π½ всСх Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. КаТдоС ΠΈΠ· этих ΠΈΠΌΠ΅Π½ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
$file
Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°
for
.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π±Π΅Π³Π»ΠΎ просмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ подстановки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ мСтасимвола. Допустим, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ вывСсти Π½Π° экран всС ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² сцСнариСв Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Π±ΡƒΠΊΠ²Ρ‹ "f", ΠΈ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° всСх Π²Π°ΡˆΠΈΡ… сцСнариСв Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ символами .sh. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#!/bin/sh

for file in $(ls f*.sh); do

Β lpr $file

done

exit 0

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ синтаксичСской конструкции

$(<i>ΠΊΠΎΠΌΠ°Π½Π΄Π°</i>)
, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π΄Π°Π»Π΅Π΅ (Π² Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнном Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Ρ†ΠΈΠΊΠ»Π°
for
задаСтся Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ
$()
.