Сделай Сам Свою Работу на 5

Вычисление арифметических выражений





 

Операторы для вычисления арифметических выражений представлены в таблице в порядке понижения приоритета. Для изменения порядка вычисления используются скобки.

 

Оператор Значение
- унарный минус
!- логическое отрицание, двоичная инверсия (дополнение до единицы)
*, /, % умножение, деление, взятие остатка от деления
+, - сложение, вычитание
<<, >> поразрядный сдвиг влево, поразрядный сдвиг вправо
==, != проверка на равенство, проверка на неравенство
& поразрядное И
^ поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ
| поразрядное ИЛИ
&& логическое И
|| логическое ИЛИ
= присваивание значения
+=, -+ присваивание после сложения, присваивание после вычитания
*=, /=, %= присваивание после умножения, присваивание после деления, присваивание после взятия остатка от деления
<<=, >>= присваивание после поразрядного сдвига влево, присваивание после поразрядного сдвига вправо

 

Команда let выражение позволяет вычислять целочисленные арифметические выражения. Выражения состоят из чисел, операторов и переменных интерпретатора (без предшествующего символа $). Выражения должны браться в кавычки, если содержат пробелы либо другие специальные символы. Например:



let 2*7 # выдает значение 14

let a=11 # То же, что и a=11

let a=a+5 # Эквивалентно "a = a + 5"

let "a /= 4" # Эквивалентно let "a = a / 4"

let "a -= 5" # Эквивалентно let "a = a - 5"

let "a %= 8" # Эквивалентно let "a = a % 8"

let "count=0" "i=i+1" # Присвоить значения переменным i и count

let "num % 2" # Проверка числа на четность

Команда expr выражение является универсальным обработчиком выражений и применяется для вычисления заданного выражения. Операнды выражения обязательно должны отделяться друг от друга пробелами, а метасимволы (например, оператор умножения) должны быть экранированы. Выражения могут быть арифметическими, логическими или строковыми. Например:

 

expr 3 + 5 # возвратит 8

expr 5 % 3 # возвратит 2

expr 5 \* 3 # возвратит 15

 

Примеры подстановки арифметических выражений:

 



A=`expr \(5 + 3 \) / 3` # переменной А присвоить (5+3)/3

y=`expr $y + 1` # Операция инкремента переменной y,

# то же самое, что и let y=y+1

# или y=$(($y+1)).

 

В арифметических подстановках обратные одиночные кавычки могут быть заменены на двойные круглые скобки – $((...)) и $((...)) или конструкцией, с применением команды let.

 

z=$(($z+3))

z=$((z+3)) # аналогично предыдущей команде

foo=$(( ((5 + 3*2) – 4) / 2 )) # в результате выполнения этой команды

# переменная foo примет значение 3

 

Примечание: внутри двойных круглых скобок подстановка переменных выполняется автоматически.

 

Управляющие конструкции

 

Простая команда – это последовательность слов, разделенная пробелами. Первое слово является именем команды, которая будет выполняться, а остальные будут переданы ей как аргументы. Имя команды передается ей как аргумент номер 0 (т.е. имя команды является значением $0). Значение, возвращаемое простой командой - это ее статус завершения, если она завершилась нормально, или (восьмеричное) 200+статус, если она завершилась аварийно.

Список – это последовательность одной или нескольких команд, разделенных символами ;, &, && или || и быть может заканчивающаяся символом ; или &. Из четырех указанных операций ; и & имеют равные приоритеты, меньшие, чем у && и ||. Приоритеты последних также равны между собой. Символ ; означает, что команды будут выполняться последовательно, а & - параллельно. Операция && (||) означает, что список, следующий за ней будет выполняться лишь в том случае, если код завершения предыдущего конвейера нулевой (ненулевой).

Команда – это либо простая команда, либо одна из управляющих конструкций. Кодом завершения команды является код завершения ее последней простой команды.



Условный оператор

if <условие1> then <список1> [ elif < условие2> then <список2> ] . . . [ else <список3> ] fi

Выполняется <условие1> и, если код его завершения 0, то выполняется <список1>, иначе - <условие3> и, если и его код завершения 0, то выполняется <список2>. Если же это не так, то выполняется <список3>. Части elif и else могут отсутствовать.

В качестве условий могут использоваться обычные команды, однако наиболее часто – это вызов одной или нескольких команд test в виде

 

test выражение

 

или просто [ выражение ]. Обратите внимание: пробелы, отделяющие выражение от квадратных скобок, обязательны. Подробно команда test рассмотрена ниже.

Пример. Программа, которая вызывается с двумя параметрами и определяет их сумму.

 

#!/bin/bash

n=$# # определяем количество переданных параметров

if [ n==0 ] # если не передано ни одного

then

echo Input a b # выводим приглашение к вводу параметров

read a b # читаем параметры в переменные а и b

elif [ n==1 ] # иначе, если передан один параметр

then

a=$1 # переменной а придаем его значение

echo Input b # выводим приглашение к вводу второго параметра

read b # читаем параметр в переменную b

elif [ n==2 ] # иначе, если переданы оба параметра

then

a=$1 переменной а придаем значение первого параметра

b=$2 # переменной b придаем значение первого параметра

else # иначе (если не передано ни одного параметра)

echo Usage: $0 [a [b]] # выводим справку по работе программы

fi # конец условного оператора

s=$((a+b)) # или s=`expr $a + $b` - вычисляем сумму чисел,

# поместив ее в переменную s

echo $s # выводим результат

Команда test

Команда test применяется для проверки условия. Формат вызова:

 

test <выражение> или просто [ <выражение> ]

Команда test вычисляет <выражение> и, если его значение – истина, возвращает код завершения 0 (true); иначе – ненулевое значение (false). Ненулевой код завершения возвращается и если опущены аргументы.

Примечание: на самом деле оболочка будет распознавать эту команду по открывающей скобке «[», как слову, соответствующему команде test. Уже этого достаточно, чтобы предупредить о распространенной ошибке: между скобками и содержащимся в них условием обязательно должны быть пробелы. Пробелы должны быть и между значениями и символом сравнения или операции (как и в команде expr) (не путать с противоположным требованием для присваивания значений переменным!).

В сценариях оболочки используются условия различных типов.

1. Условия проверки файлов:

-f file - файл file является обычным файлом;

-d file - файл file - каталог;

-с file - файл file - специальный файл;

-r file - имеется разрешение на чтение файла file;

-w file - имеется разрешение на запись в файл file;

-s file - файл file не пустой.

Пример. Вводя с клавиатуры командные строки, в первом случае получим подтверждение (код завершения 0), а во втором – опровержение (код завершения 1). specific – имя существующего файла.

 

[ -f specific ] ; echo $?

 

[ -d specific ] ; echo $?

2. Условия проверки строк:

str1 = str2 - строки str1 и str2 совпадают;

str1 != str2 - строки str1 и str2 не совпадают;

-n str1 - строка str1 существует (непустая);

-z str1 – строка str1 не существует (пустая).

Примеры:

 

x="who is who"; export x; [ "who is who" = "$x" ]; echo $?

 

x=abc ; export x ; [ abc = "$x" ] ; echo $?

 

x=abc ; export x ; [ -n "$x" ] ; echo $?

 

x="" ; export x ; [ -n "$x" ] ; echo $?

 

Примечание: команда test дает значение «истина» (код завершения 0), если в скобках стоит просто непустое слово:

 

[ privet ] ; echo $?

 

[ ] ; echo $?

 

Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки):

 

true ; echo $?

 

false ; echo $?

 

3. Условия сравнения целых чисел:

x -eq y - x равно y;

x -ne y - x не равно y;

x -gt y - x больше y;

x -ge y - x больше или равно y;

x -lt y - x меньше y;

x -le y - x меньше или равно y.

То есть в данном случае команда test воспринимает строки символов как целые (!) числа. Поэтому во всех остальных случаях нулевому значению соответствует пустая строка. В данном же случае, если надо обнулить переменную, скажем, x, то это достигается присваиванием x=0.

Примеры:

 

x=abc ; export x ; [ abc -eq "$x" ] ; echo $?

"[": integer expression expected before -eq

 

x=321 ; export x ; [ 321 -eq "$x" ] ; echo $?

 

x=3.21 ; export x ; [ 3.21 -eq "$x" ] ; echo $?

"[": integer expression expected before -eq

 

x=321 ; export x ; [ 123 -lt "$x" ] ; echo $?

Сложные условия реализуются с помощью типовых логических операций:

! - (not) инвертирует значение кода завершения;

-o - (or) соответсвует логическому ИЛИ;

-a - (and) соответсвует логическому И.

Примеры:

 

[ ! privet ] ; echo $?

 

x=privet; export x; [ "$x" -a -f specific ] ; echo $?

 

x="";export x; [ "$x" -a -f specific ] ; echo $?

 

x="";export x; [ "$x" -a -f specific -o privet ] ; echo $?

 

x="";export x; [ "$x" -a -f specific -o ! privet ] ; echo $?

 

Оператор выбора

case $<переменная> in <шаблон11> | <шаблон12>... ) <список1> ;; <шаблон21> | <шаблон22>... ) <список2> ;; . . . esac

Оператор выбора выполняет <список>, соответствующий первому <шаблону>, которому удовлетворяет <переменная>. Форма шаблона та же, что и используемая в именах файлов. Часть | <шаблон>... может отсутствовать.

Пример. Вводим название фрукта и в зависимости от введенного значения выводим его описание, а если не введено ничего, то выводим соответствующее сообщение.

#!/bin/bash

echo Input FRUIT # выводим приглашение к вводу названия фрукта

read FRUIT # читаем параметр в переменную FRUIT

case $FRUIT in # условие

apple) echo Apple is red. # альтернатива 1

banana) echo Banana is yellow. # альтернатива 2

plum) echo Plum is blue. # альтернатива 3

*) echo Nothing to say about $1 … # иначе

esac

 

Операторы цикла

Язык оболочки позволяет организовывать циклическое выполнение команд. В распоряжение пользователю предлагается 4 варианта циклов: while, until, for и select.

 

Цикл while

 

Оператор цикла whileимеет следующий синтаксис:

while <условие>

do

<список>

done

При выполнении цикла сначала выполняется список команд, представляющих <условие>. Если результат ненулевой, то происходит выход из цикла, в противном случае выполняется тело цикла <список> и происходит переход на следующую итерацию. Хотя в качестве условия <команда> может использоваться любая допустимая в UNIX команда, обычно это команда test.

Ниже приведен пример сценария, в котором производится выдача на терминал десяти последовательных чисел от 0 до 9.

 

#!/bin/sh

x=0

while [ $x –lt 10 ] # значение переменной x меньше 10?

do

echo $x # выводим х

x=`expr $x + 1` # увеличиваем x на 1

Done

В следующем примере в файл log каждую минуту записывается текущая дата и время:

 

#!/bin/bash

while (true)

do

date >> log

sleep 60 # подождать минуту

done

 

 

Цикл until

 

Оператор цикла untilаналогичен оператору while иимеет следующий синтаксис:

until <условие>

do

<список>

done

Отличие между циклами while и until заключается в том, что результат, возвращаемый при выполнении списка команд <условия>, берется с отрицанием: <список> выполняется в том случае, если последняя команда в списке <условие> возвращает ненулевой статус выхода.

Ниже приведен пример сценария, в котором производится выдача на терминал десяти последовательных чисел от 0 до 9, но уже с использованием цикла until.

 

#!/bin/sh

x=0

until [ $x -ge 10 ] # значение переменной x больше или равно 10?

do

echo $x # выводим х

x=`expr $x + 1` # увеличиваем x на 1

done

 

Цикл for

Цикл forвыполняет команды из <списка> для каждого <элемента> и имеет следующий синтаксис:

 

for <переменная> [in <элемент1> <элемент2> … <элементN>]

do

<список>

done

Оператор for работает немного не так, как в обычных языках программирования. Вместо того чтобы организовывать увеличение или уменьшение на единицу значения некоторой переменной при каждом проходе цикла, он при каждом проходе цикла присваивает переменной очередное значение из заданного списка элементов. В качестве элементов можно использовать различные шаблоны.

Если конструкция [in <элемент1> <элемент2> … <элементN>] опущена, то список команд <список> выполняется один раз для каждого позиционного параметра, который задан.

Рассмотрим пример использования цикла for:

#!/bin/sh

for FILE in $HOME/*.txt

do

cp $FILE ${HOME}/scripts

chmod a+r ${HOME}/texts/${FILE}

done

В приведённом примере все файлы из домашнего каталога пользователя, которые заканчиваются на .txt, копируются в каталог texts и делаются доступными для чтения всем пользователям.

 

Язык программирования оболочки содержит операторы, нарушающие нормальное выполнение цикла. Эти операторы имеют названия – break (позволяет выполнить безусловный выход из цикла)и continue (приводит к тому, что программа немедленно переходит к следующей итерации цикла без выполнения остальных команд в цикле).

 

Цикл select

 

Цикл selectпозволяет создавать удобные меню. Он полезен, когда необходимо, чтобы пользователь выбрал один элемент из предлагаемого списка. Оператор selectимеет такой же вид, как и оператор for, за исключением ключевого слова:

 

select <переменная> [in <элемент1> <элемент2> … <элементN>]

do

<список>

done

 

При выполнении данного оператора цикла все элементы из списка высвечиваются на экране вместе с их порядковыми номерами, после чего появляется специальное приглашение для ввода. Обычно оно имеет вид #? (стандартное приглашение PS3).

Введённый пользователем номер пункта меню записывается в переменную REPLY, а в <переменную> заносится значение соответствующего <элемента> из списка элементов. Если введена пустая строка, то список для выбора будет выдан заново.

После того как пользователем будет сделан допустимый выбор, выполнятся команды из <списка>, после чего выполнение цикла повторяется с самого начала. Выход из цикла осуществляется теми же средствами, что и для whileи for.

Пример:

 

#!/bin/bash

echo What operating system do you prefer?

select name in "Red Hat Linux" "Ubuntu" "Free BSD" "Other"; do

break

done

if [ $REPLY == 1 ]

then

echo You chose $name. Good choice!

elif [ $REPLY == 2 -o $REPLY == 3 -o $REPLY == 4 ]

then

echo You chose $name.

else

echo You must choose the right number!

fi

После запуска этого сценария на экран будет выдан следующий запрос:

What operating system do you prefer?

1) Red Hat Linux

2) Ubuntu

3) Free BSD

4) Other

#?

Оболочка ожидает ввода строки на стандартном вводе после символов #?. Нажмите любую из 4 предложенных цифр (1, 2, 3 или 4) и увидите соответствующее сообщение. Если вы, например, введете 1, то увидите сообщение:

You chose Red Hat Linux. Good choice!

При вводе цифры, отличной от 1, 2, 3 или 4, вы увидите сообщение

You must choose the right number!

 

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.