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

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

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

echo "var1 = '$var1'"

echo "var2 = '$var2'"

echo "var3 = '$var3'"

echo "var4 = '$var4'"

echo "var5 = '$var5'"

Π­Ρ‚ΠΎΡ‚ сцСнарий Π²Π²ΠΎΠ΄ΠΈΡ‚, присваиваСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ пяти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ дСйствуСт ΠΊΠΎΠΌΠ°Π½Π΄Π° read, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π°Π·Π½ΠΎΠ΅ число Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

[ [email protected] ~]$ read-multiple

Enter one or more values > a b c d e

var1 = 'a'

var2 = 'b'

var3 = 'c'

var4 = 'd'

var5 = 'e'

[ [email protected] ~]$ read-multiple

Enter one or more values > a

var1 = 'a'

var2 = ''

var3 = ''

var4 = ''

var5 = ''

[ [email protected] ~]$ read-multiple

Enter one or more values > a b c d e f g

var1 = 'a'

var2 = 'b'

var3 = 'c'

var4 = 'd'

var5 = 'e f g'

Если read ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ число Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ мСньшС, Ρ‡Π΅ΠΌ оТидаСтся, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, останутся пустыми, Π° ΠΏΡ€ΠΈ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠΌ количСствС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ послСдняя пСрСмСнная ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ вСсь остаток Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ строки.

Если Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ read, вСсь Π²Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ сохранСн Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ REPLY:

#!/bin/bash

# read-single: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ мноТСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

echo -n "Enter one or more values > "

read

echo "REPLY = '$REPLY'"

Запуск этого сцСнария ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ:

[ [email protected] ~]$ read-single

Enter one or more values > a b c d

REPLY = 'a b c d'

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹


read ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ Π² Ρ‚Π°Π±Π». 28.1.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ доступ ΠΊ довольно интСрСсным способам использования read. НапримСр, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -p позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ строку ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΊ Π²Π²ΠΎΠ΄Ρƒ:

#!/bin/bash

# read-single: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ мноТСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

read -p "Enter one or more values > "

echo "REPLY = '$REPLY'"

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ -t ΠΈ -s ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ сцСнарии, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π²ΠΎΠ΄ «сСкрСтных» Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π²Π²ΠΎΠ΄ ΠΏΠΎ истСчСнии Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:

#!/bin/bash

# read-secret: Π²Π²ΠΎΠ΄ сСкрСтного пароля

if read -t 10 -sp "Enter secret passphrase > " secret_pass; then

echo -e "\nSecret passphrase = '$secret_pass'"

else

echo -e "\nInput timed out" >&2

exit 1

fi

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

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ Π² строкС Π²Π²ΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ IFS


ΠžΠ±Ρ‹Ρ‡Π½ΠΎ командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° выполняСт Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° Π½Π° слова ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ read. Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ слова Π²ΠΎ Π²Π²ΠΎΠ΄Π΅, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ, становятся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ read Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ рСгулируСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с ΠΈΠΌΠ΅Π½Π΅ΠΌ IFS (ΠΎΡ‚ Internal Field Separator β€” Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ»Π΅ΠΉ). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ пСрСмСнная IFS Ρ…Ρ€Π°Π½ΠΈΡ‚ символы ΠΏΡ€ΠΎΠ±Π΅Π»Π°, табуляции ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΠΎΠ»Π΅ΠΉ.

ИзмСняя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ IFS, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π° Π½Π° поля ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ read. НапримСр, Ρ„Π°ΠΉΠ» /etc/passwd Ρ…Ρ€Π°Π½ΠΈΡ‚ строки Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… поля ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ. ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ IFS Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, состоящСС ΠΈΠ· СдинствСнного двоСточия, ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ read ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ содСрТимоС /etc/passwd ΠΈ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ строки Π½Π° поля для присваивания Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. НиТС приводится сцСнарий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΈ дСйствуСт:

#!/bin/bash

# read-ifs: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

FILE=/etc/passwd

read -p "Enter a username > " user_name

file_info=$(grep "^$user_name:" $FILE) (1)

if [ -n "$file_info" ]; then

IFS=":" read user pw uid gid name home shell <<< "$file_info" (2)

echo "User = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'"

echo "Full Name = '$name'"

echo "Home Dir. = '$home'"

echo "Shell = '$shell'"

else

echo "No such user '$user_name'" >&2

exit 1

fi

Π­Ρ‚ΠΎΡ‚ сцСнарий ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ввСсти имя ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи Π² систСмС ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ поля, Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ записи Π² Ρ„Π°ΠΉΠ»Π΅ /etc/passwd. Π’ сцСнарии Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ интСрСсныС строки. ΠŸΠ΅Ρ€Π²Π°Ρ, отмСчСнная Π·Π½Π°ΠΊΠΎΠΌ (1), присваиваСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ grep ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ file_info. РСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /etc/passwd СдинствСнной строки, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Вторая интСрСсная строка, отмСчСнная Π·Π½Π°ΠΊΠΎΠΌ (2), состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… частСй: присваивания значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ read со списком ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ Π½Π°ΠΌ, Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° пСрСнаправлСния. Рассмотрим сначала присваиваниС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ присваивания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π»ΠΈΡΡŽΡ‚. Они ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся ΠΊΠΎΠΌΠ°Π½Π΄Π°. ДСйствиС этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ присваивания носит Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° врСмя выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ IFS сохраняСтся символ двоСточия. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅:

OLD_IFS="$IFS"

IFS=":"

read user pw uid gid name home shell <<< "$file_info"

IFS="$OLD_IFS"

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ сохранили ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ IFS, присвоили Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ read ΠΈ восстановили ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ IFS. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅.

read нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅

Π”Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° read способна ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ со стандартного Π²Π²ΠΎΠ΄Π°, ΠΎΠ½Π° Π½Π΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

echo "foo" | read

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ этот ΠΏΡ€ΠΈΠ΅ΠΌ сработаСт, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ. Π’Π½Π΅ΡˆΠ½Π΅ всС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»Π°, Π½ΠΎ ΠΏΡ€ΠΈ этом пСрСмСнная REPLY всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ пустой. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

ΠžΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ. Π’ bash (ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ sh) ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ (subshells). Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ копиями Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΈ Π΅Π΅ окруТСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°Ρ…. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° read выполняСтся Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅.

Для ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡Π΅ΠΊ Π² Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… систСмах ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΏΠΈΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ окруТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² Ρ€Π°Π±ΠΎΡ‚Π΅. Когда ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, копия окруТСния уничтоТаСтся. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ смоТСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса. Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, read присваиваСт значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ становятся Ρ‡Π°ΡΡ‚ΡŒΡŽ окруТСния. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ read присвоит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ foo ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ REPLY Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, ΠΏΠΎΠ΄ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° ΠΈ Π΅Π΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Ρ‹, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ присваивания Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‚Ρ€Π°Ρ‡Π΅Π½.

ИспользованиС встроСнных строк β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² Π³Π»Π°Π²Π΅ 36.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ <<< ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ строку. ВстроСнная строка (here string) ΠΏΠΎΠ΄ΠΎΠ±Π½Π° встроСнному Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅, ΠΎΠ½Π° простираСтся лишь Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки ΠΊΠΎΠ΄Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ строка с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /etc/passwd подаСтся Π½Π° стандартный Π²Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ read. Π£ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ вопрос, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Ρ‚Π°ΠΊΠΎΠΉ, нСсколько Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ, способ вмСсто

echo "$file_info" | IFS=":" read user pw uid gid name home shell

Π‘ΠΊΠ°ΠΆΠ΅ΠΌ Ρ‚Π°ΠΊ: Π½Π° Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ свои причины…

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π²ΠΎΠ΄Π°


ИспользованиС Π½ΠΎΠ²ΠΎΠΉ для нас возмоТности ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π²Π²ΠΎΠ΄Π° с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡ‡Π΅Π½ΡŒ часто Ρ…ΠΎΡ€ΠΎΡˆΠΎ написанная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° отличаСтся ΠΎΡ‚ ΠΏΠ»ΠΎΡ…ΠΎ написанной Π³ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊ нСоТиданностям. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ нСоТиданности Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π²Π²ΠΎΠ΄Π° ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ ΡƒΠΆΠ΅ сдСлали ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡΡ‚ΠΎΡΡ‚ΡŒ нСоТиданностям Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Ρ‹, Π³Π΄Π΅ прСдусмотрСно отсСиваниС пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с Π½Π΅Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹ΠΌΠΈ символами. Π’Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ для Π»ΡŽΠ±Ρ‹Ρ… Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΎΡ‚ нСдопустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… мноТСством ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠžΡ‚ΠΊΠ°Π· ΠΎΡ‚ Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Ρ… ΠΌΠ΅Ρ€ Ρ€Π°Π΄ΠΈ экономии проститСлСн, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ для ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ использования Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ с Ρ†Π΅Π»ΡŒΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΠ΅ΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Но Π΄Π°ΠΆΠ΅ Π² этом случаС, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², Π½Π° всякий случай Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² Π½Π΅Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ….

Π”Π°Π»Π΅Π΅ приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΠΉ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°:

#!/bin/bash

# read-validate: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π²ΠΎΠ΄Π°

invalid_input () {

echo "Invalid input '$REPLY'" >&2

exit 1

}

read -p "Enter a single item > "

# пустой Π²Π²ΠΎΠ΄ (нСдопустимо)

[[ -z $REPLY ]] && invalid_input

# Π²Π²ΠΎΠ΄ мноТСства элСмСнтов (нСдопустимо)

(( $(echo $REPLY | wc -w) > 1 )) && invalid_input

# Π²Π²Π΅Π΄Π΅Π½ΠΎ допустимоС имя Ρ„Π°ΠΉΠ»Π°?

if [[ $REPLY =~ ^[-[:alnum:]\._]+$ ]]; then

echo "'$REPLY' is a valid filename."

if [[ -e $REPLY ]]; then

echo "And file '$REPLY' exists."

else

echo "However, file '$REPLY' does not exist."

fi

# Π²Π²Π΅Π΄Π΅Π½ΠΎ вСщСствСнноС число?

if [[ $REPLY =~ ^-?[[:digit:]]*\.[[:digit:]]+$ ]]; then

echo "'$REPLY' is a floating point number."