Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_voprosy.docx
Скачиваний:
9
Добавлен:
20.03.2016
Размер:
465.35 Кб
Скачать

Глава 22 More scripting.

22.1. Eval.

Eval считывает аргументы как ввод дляshell(в результате выполняются команды).

Это позволяет использовать значение переменной как переменную.

paul@deb503:~/test42$ answer=42

paul@deb503:~/test42$ word=answer

paul@deb503:~/test42$ eval x=\$$word ; echo $x

42

Как в bash, так и вKorn аргументы могут быть указаны.

kahlan@solexp11$ answer=42

kahlan@solexp11$ word=answer

kahlan@solexp11$ eval "y=\$$word" ; echo $y

42

Иногда eval необходим для корректного определения аргументов. Рассмотрим следующий пример, где командаdateполучает 1 параметр1 week ago.

paul@debian6~$ date --date="1 week ago"

Thu Mar 8 21:36:25 CET 2012

Когда мы помещаем эту команду в переменную, выполнение этой переменной не происходит, пока мы не используем eval.

paul@debian6~$ lastweek='date --date="1 week ago"'

paul@debian6~$ $lastweek

date: extra operand `ago"'

Try `date --help' for more information.

paul@debian6~$ eval $lastweek

Thu Mar 8 21:36:39 CET 2012

22.2. (( )).

(( )) позволяет вычислить(оценить) числовое выражение.

paul@deb503:~/test42$ (( 42 > 33 )) && echo true || echo false

true

paul@deb503:~/test42$ (( 42 > 1201 )) && echo true || echo false

false

paul@deb503:~/test42$ var42=42

paul@deb503:~/test42$ (( 42 == var42 )) && echo true || echo false

true

paul@deb503:~/test42$ (( 42 == $var42 )) && echo true || echo false

true

paul@deb503:~/test42$ var42=33

paul@deb503:~/test42$ (( 42 == var42 )) && echo true || echo false

false

22.3. let.

Встроенная shellфункцияlet заставляетshellпроизвести вычисление арифметического выражения. Она будет возвращать 0, пока последнее арифметическое выражение не примет значение 0.

[paul@RHEL4b ~]$ let x="3 + 4" ; echo $x

7

[paul@RHEL4b ~]$ let x="10 + 100/10" ; echo $x

20

[paul@RHEL4b ~]$ let x="10-2+100/10" ; echo $x

18

[paul@RHEL4b ~]$ let x="10*2+100/10" ; echo $x

30

Shellтакже может осуществлять перевод между системами счисления.

[paul@RHEL4b ~]$ let x="0xFF" ; echo $x

255

[paul@RHEL4b ~]$ let x="0xC0" ; echo $x

192

[paul@RHEL4b ~]$ let x="0xA8" ; echo $x

168

[paul@RHEL4b ~]$ let x="8#70" ; echo $x

56

[paul@RHEL4b ~]$ let x="8#77" ; echo $x

63

[paul@RHEL4b ~]$ let x="16#c0" ; echo $x

192

Существует разница между прямым назначение переменной и использованием let для вычисления арифметических выражений ( даже если они просто задают значение).

kahlan@solexp11$ dec=15 ; oct=017 ; hex=0x0f

kahlan@solexp11$ echo $dec $oct $hex

15 017 0x0f

kahlan@solexp11$ let dec=15 ; let oct=017 ; let hex=0x0f

kahlan@solexp11$ echo $dec $oct $hex

15 15 15

22.4. Case.

Иногда вы можете упростить множественные ifс помощью конструкцииcase.

[paul@RHEL4b ~]$ ./help

What animal did you see ? lion

You better start running fast!

[paul@RHEL4b ~]$ ./help

What animal did you see ? dog

Don't worry, give it a cookie.

[paul@RHEL4b ~]$ cat help

#!/bin/bash

#

# Wild Animals Helpdesk Advice

#

echo -n "What animal did you see ? "

read animal

case $animal in

"lion" | "tiger")

echo "You better start running fast!"

;;

"cat")

echo "Let that mouse go..."

;;

"dog")

echo "Don't worry, give it a cookie."

;;

"chicken" | "goose" | "duck" )

echo "Eggs for breakfast!"

;;

"liger")

echo "Approach and say 'Ah you big fluffy kitty...'."

;;

"babelfish")

echo "Did it fall out your ear ?"

;;

*)

echo "You discovered an unknown animal, name it!"

;;

esac

[paul@RHEL4b ~]$

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]