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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° языкС сцСнариСв ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 73

Автор МСндСль ΠšΡƒΠΏΠ΅Ρ€

var1 = 23 # ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: 'var1=23'.

# Π’ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ строкС Bash Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ "var1" ΠΊΠ°ΠΊ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

# с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ "=" ΠΈ "23".


let c = $a - $b # ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: 'let c=$a-$b' ΠΈΠ»ΠΈ 'let "c = $a - $b"'


if [ $a -le 5] # ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: if [ $a -le 5 ]

# if [ "$a" -le 5 ] Π΅Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅.

# [[ $a -le 5 ]] Ρ‚ΠΎΠΆΠ΅ Π²Π΅Ρ€Π½ΠΎ.


ΠžΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌ являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ содСрТат "ноль". НСинициализированныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ содСрТат "пустоС" (null) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π½Π΅ ноль.

#!/bin/bash


echo "uninitialized_var = $uninitialized_var"

# uninitialized_var =


Часто программисты ΠΏΡƒΡ‚Π°ΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сравнСния = ΠΈ -eq. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ = ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для сравнСния строковых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π° -eq -- для сравнСния Ρ†Π΅Π»Ρ‹Ρ… чисСл.

if [ "$a" = 273 ] # Как Π²Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅? $a -- это Ρ†Π΅Π»ΠΎΠ΅ число ΠΈΠ»ΠΈ строка?

if [ "$a" -eq 273 ] # Если $a -- Ρ†Π΅Π»ΠΎΠ΅ число.


# Иногда, Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ошибка Π½ΠΈΠΊΠ°ΠΊ сСбя Π½Π΅ проявляСт.

# Однако...


a=273.0 # НС Ρ†Π΅Π»ΠΎΠ΅ число.


if [ "$a" = 273 ]

then

echo "Π Π°Π²Π½Ρ‹."

else

echo "НС Ρ€Π°Π²Π½Ρ‹."

fi # НС Ρ€Π°Π²Π½Ρ‹.


# Ρ‚ΠΎΠΆΠ΅ самоС ΠΈ для a=" 273" ΠΈ a="0273".


# ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΈ использовании "-eq" со строковыми значСниями.


if [ "$a" -eq 273.0 ]

then

echo "a = $a'

fi # ИсполнСниС сцСнария прСрываСтся ΠΏΠΎ ошибкС.

# test.sh: [: 273.0: integer expression expected


Ошибки ΠΏΡ€ΠΈ сравнСнии Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΈ строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

#!/bin/bash

# bad-op.sh


number=1


while [ "$number" < 5 ] # НСвСрно! Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ while [ "number" -lt 5 ]

do

echo -n "$number "

let "number += 1"

done


# Π­Ρ‚ΠΎΡ‚ сцСнарий Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сообщСниС ΠΎΠ± ошибкС:

# bad-op.sh: 5: No such file or directory


Иногда, Π² опСрациях ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, с использованиСм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок ([ ]), ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ€Π°Ρ‚ΡŒ Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 7-6, ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 16-4 ΠΈ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9-6.

Иногда сцСнарий Π½Π΅ Π² состоянии Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ ΠΏΡ€Π°Π² доступа. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ смоТСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‚ΠΎ эта ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ смоТСт Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΈ ΠΈΠ· сцСнария. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π°ΠΌ придСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ suid.

ИспользованиС символа - Π² качСствС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° пСрСнаправлСния (ΠΊΠ°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΎΠ½ Π½Π΅ являСтся) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

command1 2> - | command2 # ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΊΠΎΠΌΠ°Π½Π΄Π΅ command1 Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€...

# ...Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.


command1 2>& - | command2 # Π’Π°ΠΊ ΠΆΠ΅ бСссмыслСнно.


Бпасибо S.C.


ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… особСнностСй Bash вСрсии 2 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ сцСнария, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Bash вСрсии 1.XX.

#!/bin/bash


minimum_version=2

# ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Chet Ramey постоянно Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ Bash,

# Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ минимально Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ $minimum_version=2.XX.

E_BAD_VERSION=80


if [ "$BASH_VERSION" \< "$minimum_version" ]

then

echo "Π­Ρ‚ΠΎΡ‚ сцСнарий Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Bash, вСрсии $minimum ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅."

echo "ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ."

exit $E_BAD_VERSION

fi


...


ИспользованиС спСцифичСских особСнностСй Bash ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ сцСнария Π² Bourne shell (#!/bin/sh). Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² Linux дистрибутивах, sh являСтся псСвдонимом bash, Π½ΠΎ это Π½Π΅ всСгда Π²Π΅Ρ€Π½ΠΎ для UNIX-систСм Π²ΠΎΠΎΠ±Ρ‰Π΅.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ строки ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π² стилС MS-DOS (\r\n), Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ комбинация #!/bin/bash\r\n считаСтся нСдопустимой. Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ простым ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ символа \r ΠΈΠ· сцСнария.

#!/bin/bash


echo "Начало"


unix2dos $0 # Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ символы ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DOS.

chmod 755 $0 # ВосстановлСниС ΠΏΡ€Π°Π² Π½Π° запуск.

# Команда 'unix2dos' ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΎ Π½Π° запуск ΠΈΠ· Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»Π°.


./$0 # ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСбя самого.

# Но это Π½Π΅ сработаСт ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ строки ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ

# Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π² стилС DOS.


echo "ΠšΠΎΠ½Π΅Ρ†"


exit 0


Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с #!/bin/sh, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΉ совмСстимости с Bash. НСкоторыС ΠΈΠ· спСцифичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, присущих Bash, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊ использованию. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ доступа ΠΊΠΎ всСм Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΡΡ Π² Bash, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ строкой #!/bin/bash.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу - ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅. Π—Π΄Π΅ΡΡŒ ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅, ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Ρ‚Ρ‹ родитСля, Π½ΠΎ Π½Π΅ Π½Π°ΠΎΠΎΠ±ΠΎΡ€ΠΎΡ‚.

WHATEVER=/home/bozo

export WHATEVER

exit 0

bash$ echo $WHATEVER


bash$

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ -- ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку пСрСмСнная $WHATEVER останСтся Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ.

ИспользованиС Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 31-1. Западня Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅

#!/bin/bash

# Западня Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅.


outer_variable=внСшняя_пСрСмСнная

echo

echo "outer_variable = $outer_variable"

echo


(

# Запуск Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅


echo "Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ outer_variable = $outer_variable"

inner_variable=внутрСнняя_пСрСмСнная # Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

echo "Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ inner_variable = $inner_variable"

outer_variable=внутрСнняя_пСрСмСнная # Как Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅? Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ внСшнюю ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ?

echo "Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ outer_variable = $outer_variable"


# Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ

)


echo

echo "Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ inner_variable = $inner_variable" # НичСго Π½Π΅ выводится.

echo "Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ outer_variable = $outer_variable" # внСшняя_пСрСмСнная.

echo


exit 0

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚ echo ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ read ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π’ этом сцСнарии, ΠΊΠΎΠΌΠ°Π½Π΄Π° read дСйствуСт Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅. ВмСсто Π½Π΅Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ set (см. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11-14).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 31-2. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ echo ΠΊΠΎΠΌΠ°Π½Π΄Π΅ read, ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ

#!/bin/bash

# badread.sh:

# ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° использования 'echo' ΠΈ 'read'

#+ для записи Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.


a=aaa

b=bbb

c=ccc


echo "ΠΎΠ΄ΠΈΠ½ Π΄Π²Π° Ρ‚Ρ€ΠΈ" | read a b c

# ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ значСния Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ a, b ΠΈ c.


echo

echo "a = $a" # a = aaa

echo "b = $b" # b = bbb

echo "c = $c" # c = ccc

# ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ.


# ------------------------------


# ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.


var=`echo "ΠΎΠ΄ΠΈΠ½ Π΄Π²Π° Ρ‚Ρ€ΠΈ"`

set -- $var

a=$1; b=$2; c=$3


echo "-------"

echo "a = $a" # a = ΠΎΠ΄ΠΈΠ½

echo "b = $b" # b = Π΄Π²Π°

echo "c = $c" # c = Ρ‚Ρ€ΠΈ

# На этот Ρ€Π°Π· всС Π² порядкС.


# ------------------------------


# ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ 'read', для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

# Но Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅.


a=aaa # ВсС сначала.

b=bbb

c=ccc


echo; echo

echo "ΠΎΠ΄ΠΈΠ½ Π΄Π²Π° Ρ‚Ρ€ΠΈ" | ( read a b c;

echo "Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ: "; echo "a = $a"; echo "b = $b"; echo "c = $c" )

# a = ΠΎΠ΄ΠΈΠ½

# b = Π΄Π²Π°

# c = Ρ‚Ρ€ΠΈ

echo "-------"

echo "Π‘Π½Π°Ρ€ΡƒΠΆΠΈ: "

echo "a = $a" # a = aaa

echo "b = $b" # b = bbb

echo "c = $c" # c = ccc

echo


exit 0

ΠžΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ риск, для бСзопасности систСмы, прСдставляСт использованиС Π² скриптах ΠΊΠΎΠΌΠ°Π½Π΄, с установлСнным Π±ΠΈΡ‚ΠΎΠΌ "suid"[ 61 ].

ИспользованиС сцСнариСв Π² качСствС CGI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ ΠΈΠ·-Π·Π° отсутствия контроля Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π²Π·Π»ΠΎΠΌΡ‰ΠΈΠΊΠΎΠΌ Π½Π° Π΅Π³ΠΎ собствСнныС сцСнарии.

Bash Π½Π΅ совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ строки, содСрТащиС Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ слэш (//).

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ Π½Π° языкС Bash, созданныС для Linux ΠΈΠ»ΠΈ BSD систСм, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ смогут Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ Π² коммСрчСской вСрсии UNIX. Π’Π°ΠΊΠΈΠ΅ сцСнарии, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ GNU-вСрсии ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΈΡ… Π°Π½Π°Π»ΠΎΠ³ΠΈ Π² UNIX. Π­Ρ‚ΠΎ особСнно справСдливо для Ρ‚Π°ΠΊΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ тСкста, ΠΊΠ°ΠΊ tr.

Danger is near thee --

Beware, beware, beware, beware.

Many brave hearts are asleep in the deep.

So beware --

Beware.

A.J. Lamb and H.W. Petrie


Π“Π»Π°Π²Π° 32. Π‘Ρ‚ΠΈΠ»ΡŒ программирования

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

НиТС приводится нСсколько Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΏΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΡŽ сцСнариСв, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΡ… Π½Π΅ слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Руководство.


32.1. ΠΠ΅ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΡŽ сцСнариСв

ο‚· ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ свой ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ сдСлаСт ваши сцСнарии понятнСС для Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΈ Π±ΠΎΠ»Π΅Π΅ простыми, Π² обслуТивании, для вас.

ο‚· PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"

ο‚· # Π­Ρ‚Π° строка ΠΈΠΌΠ΅Π»Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ смысл Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания,

ο‚· # Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π³ΠΎΠ΄-Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ тяТСло Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ -- Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚.

ο‚· # (Из сцСнария "pw.sh", Π°Π²Ρ‚ΠΎΡ€: Antek Sawicki)


ДобавляйтС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ сцСнария ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ функциями.