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

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

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

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

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


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

#!/bin/bash


#************************************************#

# xyz.sh #

# Π°Π²Ρ‚ΠΎΡ€: Bozo Bozeman #

# Июль 05, 2001 #

# #

# Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. #

#************************************************#


BADDIR=65 # НСт Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

projectdir=/home/bozo/projects # ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.


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

# cleanup_pfiles () #

# УдаляСт всС Ρ„Π°ΠΉΠ»Ρ‹ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. #

# ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: $target_directory #

# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: 0 -- Π² случаС успСха, #

# $BADDIR -- Π² случаС ошибки. #

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

cleanup_pfiles ()

{

if [ ! -d "$1" ] # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сущСствования Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

then

echo "$1 -- Π½Π΅ являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ."

return $BADDIR

fi


rm -f "$1"/*

return 0 # УспСшноС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

}


cleanup_pfiles $projectdir


exit 0

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ваш сцСнарий с sha-bang -- #!/bin/bash.

ο‚· ЗамСняйтС ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ значСния константами. Π­Ρ‚ΠΎ сдСлаСт ваш сцСнарий Π±ΠΎΠ»Π΅Π΅ простым для понимания ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния, Π½Π΅ опасаясь Π·Π° Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.

ο‚· if [ -f /var/log/messages ]

ο‚· then

ο‚· ...

ο‚· fi

ο‚· # ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ Π»Π΅Ρ‚

ο‚· # Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ /var/log/messages Π½Π° /var/log/syslog.

ο‚· # Π’ΠΎΠ³Π΄Π° Π²Π°ΠΌ придСтся ΠΎΡ‚Ρ‹ΡΠΊΠ°Ρ‚ΡŒ всС строки,

ο‚· # содСрТащиС /var/log/messages, ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° /var/log/syslog.

ο‚· # И ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ нСсколько Ρ€Π°Π· -- Π½Π΅ пропустили Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.

ο‚·

ο‚· # ИспользованиС "констант" Π΄Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ способ:

ο‚· LOGFILE=/var/log/messages # Если ΠΈ придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² этой строкС.

ο‚· if [ -f "$LOGFILE" ]

ο‚· then

ο‚· ...

ο‚· fi


ο‚· Π’ качСствС ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ осмыслСнныС названия.

ο‚· fl=`ls -al $dirname` # НС ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ΅ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ο‚· file_listing=`ls -al $dirname` # Π£ΠΆΠ΅ Π»ΡƒΡ‡ΡˆΠ΅.

ο‚·

ο‚· MAXVAL=10 # ΠŸΠΈΡˆΠΈΡ‚Π΅ ΠΈΠΌΠ΅Π½Π° констант Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС.

ο‚· while [ "$index" -le "$MAXVAL" ]

ο‚· ...

ο‚·

ο‚· E_NOTFOUND=75 # ИмСна ΠΊΠΎΠ΄ΠΎΠ² ошибок -- Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС,

ο‚· # ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, ΠΈΡ… ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСфиксом "E_".

ο‚· if [ ! -e "$filename" ]

ο‚· then

ο‚· echo "Π€Π°ΠΉΠ» $filename Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½."

ο‚· exit $E_NOTFOUND

ο‚· fi

ο‚·

ο‚· MAIL_DIRECTORY=/var/spool/mail/bozo # ИмСна ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния

ο‚· # Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ символами

ο‚· # Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС.

ο‚· export MAIL_DIRECTORY

ο‚·

ο‚· GetAnswer () # БмСшиваниС символов Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ Ρ€Π΅ΡˆΠΈΡΡ‚Ρ€ΠΎΠ²

ο‚· # ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ο‚· {

ο‚· prompt=$1

ο‚· echo -n $prompt

ο‚· read answer

ο‚· return $answer

ο‚· }

ο‚·

ο‚· GetAnswer "Π’Π°ΡˆΠ΅ любимоС число? "

ο‚· favorite_number=$?

ο‚· echo $favorite_number

ο‚·

ο‚· _uservariable=23 # Допустимо, Π½ΠΎ Π½Π΅ рСкомСндуСтся.

ο‚· # Π–Π΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈΡΡŒ с символа подчСркивания.

ο‚· # Π’Π°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ систСмныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.


ο‚· Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ смысловыС ΠΈΠΌΠ΅Π½Π° для ΠΊΠΎΠ΄ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

ο‚· E_WRONG_ARGS=65

ο‚· ...

ο‚· ...

ο‚· exit $E_WRONG_ARGS

Π‘ΠΌ. Ρ‚Π°ΠΊ ΠΆΠ΅ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ C.

ο‚· РаздСляйтС большиС слоТныС сцСнарии Π½Π° ΡΠ΅Ρ€ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΈ простых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ΠŸΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ функциями. Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 34-4.

ο‚· НС ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ слоТными конструкциями, Ссли ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ простыми.

ο‚· COMMAND

ο‚· if [ $? -eq 0 ]

ο‚· ...

ο‚· # Π˜Π·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎ ΠΈ Π½Π΅ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ.

ο‚·

ο‚· if COMMAND

ο‚· ...

ο‚· # Π‘ΠΎΠ»Π΅Π΅ понятно ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ.


... читая исходныС тСксты сцСнариСв Π½Π° Bourne shell (/bin/sh). Π― Π±Ρ‹Π» потрясСн Ρ‚Π΅ΠΌ, насколько нСпонятно ΠΈ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ простыС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ оформлСния ΠΊΠΎΠ΄Π°. Π― Π½Π΅ Ρ€Π°Π· ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π» сСбя: "НСуТСли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π³ΠΎΡ€Π΄ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ?"

Landon Noll


Π“Π»Π°Π²Π° 33. Π Π°Π·Π½ΠΎΠ΅

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Bourne shell-Π°. Π”Π°ΠΆΠ΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ исходных тСкстов Π½Π΅ Π΄Π°Π΅Ρ‚ Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ понимания.

Tom Duff


33.1. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈ Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, с устройства tty. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, такая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° считываСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° запускС, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ строку ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΊ Π²Π²ΠΎΠ΄Ρƒ (prompt), ΠΈ, ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ заданиями. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ взаимодСйствия с ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ всСгда запускаСтся Π² Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Но, Π½Π΅ смотря Π½Π° это, ΠΎΠ½ сохраняСт доступ ΠΊ своСму tty. И Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

#!/bin/bash

MY_PROMPT='$ '

while :

do

echo -n "$MY_PROMPT"

read line

eval "$line"

done


exit 0


# Π­Ρ‚ΠΎΡ‚ сцСнарий, ΠΊΠ°ΠΊ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΊ Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ, прСдоставлСн

# Stephane Chazelas (спасибо).


Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ‚Π°ΠΊΠΎΠΉ сцСнарий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ read (см. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11-2). Π’ "Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ" всС Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС. Пока ΠΆΠ΅, Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ прСдполоТСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ сцСнарий ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Ρ€Π°ΠΌΠΊΠ°ΠΌΠΈ tty, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ сцСнарий Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌa, Ρ‚.Π΅ консоль ΠΈΠ»ΠΈ ΠΎΠΊΠ½ΠΎ xterm.

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

НСинтСрактивныС сцСнарии прСкрасно ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ„ΠΎΠ½Π΅, Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ -- ΠΏΠΎΠ΄Π²ΠΈΡΠ°ΡŽΡ‚, ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡŒ Π½Π° опСрациях, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π²Π²ΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. БлоТности, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ с запуском ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… сцСнариСв Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ expect-сцСнария ΠΈΠ»ΠΈ встроСнного Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… случаях, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ read (read variable <file). Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ позволят ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ сцСнарии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ смогут Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ Π² Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ….

Если Π²Π½ΡƒΡ‚Ρ€ΠΈ сцСнария Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ -- ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ, это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния $PS1.

if [ -z $PS1 ] # ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ?

then

# Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ

...

else

# ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ

...

fi

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ -- ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° установки Ρ„Π»Π°Π³Π° "i" Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $-.

case $- in

*i*) # ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

;;

*) # Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

;;

# (Из "UNIX F.A.Q.," 1993)


Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ -i Π² строкС-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ #!/bin/bash -i. Однако Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… случаях сцСнарий ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ошибок, ΠΏΠΎ сути, Π½Π΅Ρ‚.


33.2. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ

"ΠžΠ±Π΅Ρ€Ρ‚ΠΊΠΈ" -- это сцСнарии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² систСмных ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ»ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ освобоТдаСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΡ‚ нСобходимости Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ слоТныС ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Он особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с sed ΠΈ awk.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΈ sed ΠΈΠ»ΠΈ awk, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ„ΠΎΡ€ΠΌΠ΅: sed -e 'commands' ΠΈΠ»ΠΈ awk 'commands'. "Заворачивая" Ρ‚Π°ΠΊΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² сцСнарий Π½Π° языкС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΡ… использованиС Π±ΠΎΠ»Π΅Π΅ простым для ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, этот ΠΏΡ€ΠΈΠ΅ΠΌ позволяСт ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ sed ΠΈ awk, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅, позволяя ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π½Π° Π²Ρ…ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 33-1. сцСнарий-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°

#!/bin/bash


# Π­Ρ‚ΠΎΡ‚ простой сцСнарий удаляСт пустыС строки ΠΈΠ· тСкстового Ρ„Π°ΠΉΠ»Π°.

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ производится.

#

# Однако Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сцСнарий Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ,

# Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:

# if [ -z "$1" ]

# then

# echo "ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ использования: `basename $0` тСкстовый_Ρ„Π°ΠΉΠ»"

# exit 65

# fi


# Для выполнСния этих ΠΆΠ΅ дСйствий,

# ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ

# sed -e '/^$/d' filename


sed -e /^$/d "$1"

# '-e' -- ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ "editing" (ΠΏΡ€Π°Π²ΠΊΠ°), Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

# '^' -- с Π½Π°Ρ‡Π°Π»Π° строки, '$' -- Π΄ΠΎ Π΅Π΅ ΠΊΠΎΠ½Ρ†Π°.

# Π§Ρ‚ΠΎ соотвСтствуСт строкам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ содСрТат символов ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Ρ‡Π°Π»ΠΎΠΌ ΠΈ ΠΊΠΎΠ½Ρ†ΠΎΠΌ строки,

#+ Ρ‚.Π΅. -- пустым строкам.

# 'd' -- ΠΊΠΎΠΌΠ°Π½Π΄Π° "delete" (ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ).


# ИспользованиС ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ

#+ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‡ΡŒΠΈ ΠΈΠΌΠ΅Π½Π° содСрТат ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.


exit 0

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 33-2. Π‘ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сцСнария-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ

#!/bin/bash


# "subst", Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ

# Ρ‚.Π΅., "subst Smith Jones letter.txt".