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

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

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

ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ -- ΡΡƒΡ‚ΡŒ Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ устройство stdin для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ (ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ stdin) (ΠΊΠ°ΠΊ Π² ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3-1).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 22-7. НастоящСС имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

#!/bin/bash


# По ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ "настоящСС имя" ΠΈΠ· /etc/passwd.


ARGCOUNT=1 # ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

E_WRONGARGS=65


file=/etc/passwd

pattern=$1


if [ $# -ne "$ARGCOUNT" ]

then

echo "ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ использования: `basename $0` USERNAME"

exit $E_WRONGARGS

fi


file_excerpt () # ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ поиск Π² Ρ„Π°ΠΉΠ»Π΅ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ строки.

{

while read line

do

echo "$line" | grep $1 | awk -F":" '{ print $5 }' # Π£ΠΊΠ°Π·Ρ‹Π²Π΅Ρ‚ awk ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ":" ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ»Π΅ΠΉ.

done

} <$file # ΠŸΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ stdin для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.


file_excerpt $pattern


# Π”Π°, этот сцСнарий ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π΄ΠΎ

# grep PATTERN /etc/passwd | awk -F":" '{ print $5 }'

# ΠΈΠ»ΠΈ

# awk -F: '/PATTERN/ {print $5}'

# ΠΈΠ»ΠΈ

# awk -F: '($1 == "username") { print $5 }'

# Однако, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ Ρ‚Π°ΠΊ ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.


exit 0

НиТС приводится Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ, ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΉ, способ пСрСнаправлСния Π²Π²ΠΎΠ΄Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Он Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании пСрСнаправлСния Π²Π²ΠΎΠ΄Π° для Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

# ВмСсто:

Function ()

{

...

} < file


# ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Ρ‚Π°ΠΊ:

Function ()

{

{

...

} < file

}


# ΠŸΠΎΡ…ΠΎΠΆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚,


Function () # Π’ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

{

{

echo $*

} | tr a b

}


Function () # Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

{

echo $*

} | tr a b # НаличиС Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° -- ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ условиС.


# Бпасибо S.C.


22.2. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ "локальная" пСрСмСнная?

Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, ΠΈ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π±Π»ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹. Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ локальная пСрСмСнная "Π²ΠΈΠ΄Π½Π°" Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅Π»Π΅ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 22-8. ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

#!/bin/bash


func ()

{

local loc_var=23 # ОбъявлСниС локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

echo

echo "\"loc_var\" Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ = $loc_var"

global_var=999 # Π­Ρ‚Π° пСрСмСнная Π½Π΅ Π±Ρ‹Π»Π° объявлСна локальной.

echo "\"global_var\" Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ = $global_var"

}


func


# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, "Π²ΠΈΠ΄Π½Π°" Π»ΠΈ локальная пСрСмСнная Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.


echo

echo "\"loc_var\" Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ = $loc_var"

# "loc_var" Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ =

# Π˜Ρ‚Π°ΠΊ, $loc_var Π½Π΅ Π²ΠΈΠ΄Π½Π° Π² глобальном контСкстС.

echo "\"global_var\" Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ = $global_var"

# "global_var" Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ = 999

# $global_var ΠΈΠΌΠ΅Π΅Ρ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.

echo


exit 0

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹Π΅ Π² Ρ‚Π΅Π»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° функция Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°. Π­Ρ‚ΠΎ касаСтся всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

#!/bin/bash


func ()

{

global_var=37 # Π­Ρ‚Π° пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ нСобъявлСнной

#+ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° функция Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°.

} # ΠšΠžΠΠ•Π¦ ЀУНКЦИИ


echo "global_var = $global_var" # global_var =

# Ѐункция "func" Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π°,

#+ поэтому $global_var ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π½Π΅ "Π²ΠΈΠ΄Π½Π°" здСсь.


func

echo "global_var = $global_var" # global_var = 37

# ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Π±Ρ‹Π»Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.


22.2.1. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

Π₯отя Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ[ 52 ], Π½ΠΎ ΠΎΠ½Π° сопряТСна с большими Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ расходами ΠΈ Π½Π΅ рСкомСндуСтся для использования Π² сцСнариях[ 53 ].

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 22-9. ИспользованиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ рСкурсии

#!/bin/bash


# Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»

# ---------


# Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ bash допускаСт Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ?

# Π”Π°! Но...

# НуТно Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΡƒΠ±ΠΈΠ½Π½ΠΎΠ³ΠΎΠ»ΠΎΠ²Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² сцСнариях

# Π½Π° языкС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.


MAX_ARG=5

E_WRONG_ARGS=65

E_RANGE_ERR=66


if [ -z "$1" ]

then

echo "ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ использования: `basename $0` число"

exit $E_WRONG_ARGS

fi


if [ "$1" -gt $MAX_ARG ]

then

echo "Π’Ρ‹Ρ…ΠΎΠ΄ Π·Π° Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π» (максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ число -- 5)."

# Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

# Если Π²Π°ΠΌ захочСтся ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ,

# Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° настоящСм языкС программирования.

exit $E_RANGE_ERR

fi


fact ()

{

local number=$1

# ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ "number" Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна ΠΊΠ°ΠΊ локальная,

# ΠΈΠ½Π°Ρ‡Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ.

if [ "$number" -eq 0 ]

then

factorial=1 # Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа 0 = 1.

else

let "decrnum = number - 1"

fact $decrnum # РСкурсивный Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

let "factorial = $number * $?"

fi


return $factorial

}


fact $1

echo "Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» числа $1 = $?."


exit 0

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования рСкурсии Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² ΠŸΡ€ΠΈΠΌΠ΅Ρ€ A-18. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ рСкурсия вСсьма рСсурсоСмкоС ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ½Π° выполняСтся слишком ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, поэтому Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² сцСнариях.


Π“Π»Π°Π²Π° 23. ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹

ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ Π² Bash -- это Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ "горячиС клавиши", срСдство, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€Π° Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… строк Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Если, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Ρ„Π°ΠΉΠ» ~/.bashrc Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ строку alias lm="ls -l | more", Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹ смоТСтС ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ свои силы ΠΈ врСмя, набирая ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ lm, вмСсто Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ls -l | more. Установив alias rm="rm -i" (ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ удалСния Ρ„Π°ΠΉΠ»ΠΎΠ²), Π²Ρ‹ смоТСтС ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΡ… нСприятностСй, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сократится Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ удалСния Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ нСостороТности.

ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ Π² сцСнариях ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ вСсьма ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Ссли Π±Ρ‹ псСвдонимы ΠΈΠΌΠ΅Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΈΡΡƒΡ‰ΡƒΡŽ макроопрСдСлСниям Π² языкС C, Π½ΠΎ, ΠΊ соТалСнию, Bash Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ "Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ" Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Ρ‚Π΅Π»Π΅ псСвдонима[ 54 ]. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ псСвдониму, созданному Π²Π½ΡƒΡ‚Ρ€ΠΈ "составных конструкций", Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ if/then, Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ появлСнию ошибок. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всСгда, дСйствия, Π²ΠΎΠ·Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Π½Π° псСвдоним, Π±ΠΎΠ»Π΅Π΅ эффСктивно ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 23-1. ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ Π² сцСнарии

#!/bin/bash


shopt -s expand_aliases

# Π­Ρ‚Π° опция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, ΠΈΠ½Π°Ρ‡Π΅ сцСнарий Π½Π΅ смоТСт "Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ" псСвдонимы.


alias ll="ls -l"

# Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ псСвдонима ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ ('), Ρ‚Π°ΠΊ ΠΈ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ (") ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.


echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° обращСния ΠΊ псСвдониму \"ll\":"

ll /usr/X11R6/bin/mk* #* Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.


echo


directory=/usr/X11R6/bin/

prefix=mk* # ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ -- Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с шаблонами.

echo "ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ \"directory\" + \"prefix\" = $directory$prefix"

echo


alias lll="ls -l $directory$prefix"


echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° обращСния ΠΊ псСвдониму \"lll\":"

lll # Бписок всСх Ρ„Π°ΠΉΠ»ΠΎΠ² Π² /usr/X11R6/bin, Ρ‡ΡŒΠΈ ΠΈΠΌΠ΅Π½Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с mk.

# ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с шаблонами.


TRUE=1


echo


if [ TRUE ]

then

alias rr="ls -l"

echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° обращСния ΠΊ псСвдониму \"rr\", созданному Π²Π½ΡƒΡ‚Ρ€ΠΈ if/then:"

rr /usr/X11R6/bin/mk* #* Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ -- сообщСниС ΠΎΠ± ошибкС!

# К псСвдонимам, созданным Π²Π½ΡƒΡ‚Ρ€ΠΈ составных инструкций, нСльзя ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ.

echo "Однако, Ρ€Π°Π½Π΅Π΅ созданный псСвдоним остаСтся работоспособным:"

ll /usr/X11R6/bin/mk*

fi


echo


count=0

while [ $count -lt 3 ]

do

alias rrr="ls -l"

echo "ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° обращСния ΠΊ псСвдониму \"rrr\", созданному Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° \"while\":"

rrr /usr/X11R6/bin/mk* #* Π’Π°ΠΊ ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка.

# alias.sh: line 57: rrr: command not found

let count+=1

done


echo; echo


alias xyz='cat $0' # Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ сСбя самого.

# ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° "строгиС" ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.

xyz

# ΠŸΠΎΡ…ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚,

#+ хотя докумСнтация Bash ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ псСвдоним Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

#

# Steve Jacobson ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ

#+ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "$0" интСрпрСтируСтся нСпосрСдствСнно, Π²ΠΎ врСмя объявлСния псСвдонима.


exit 0

Команда unalias удаляСт псСвдоним, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 23-2. unalias: ОбъявлСниС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ псСвдонимов

#!/bin/bash


shopt -s expand_aliases # Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ "Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅" псСвдонимов.


alias llm='ls -al | more'

llm


echo


unalias llm # Π£Π΄Π°Π»ΠΈΡ‚ΡŒ псСвдоним.

llm

# Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС, Ρ‚.ΠΊ. ΠΊΠΎΠΌΠ°Π½Π΄Π° 'llm' большС Π½Π΅ распознаСтся.


exit 0

bash$ ./unalias.sh

total 6

drwxrwxr-x 2 bozo bozo 3072 Feb 6 14:04 .

drwxr-xr-x 40 bozo bozo 2048 Feb 6 14:04 ..

-rwxr-xr-x 1 bozo bozo 199 Feb 6 14:04 unalias.sh


./unalias.sh: llm: command not found


Π“Π»Π°Π²Π° 24. Бписки ΠΊΠΎΠΌΠ°Π½Π΄

БрСдством ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ слуТат списки: "И-списки" ΠΈ "Π˜Π›Π˜-списки". Они эффСктивно ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… if/then ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ case.

ОбъСдинСниС ΠΊΠΎΠΌΠ°Π½Π΄ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ