Linux csh if and

Операторы сравнения в UNIX shell

Статья представляет из себя шпаргалку по операторам сравнения в системах на базе UNIX. Применимо к основным командным интерпретаторам — sh (Bourne Shell), bash (Bourne Again Shell), csh, tcsh и некоторым другим.

Сравнение чисел

Оператор Описание Пример
-eq [ $x -eq $y ] Равно.
Для результат True необходимо, чтобы x был равен y.
[ 1 -eq 2 ] — False
[ 3 -eq 3 ] — True
-ne [ $x -ne $y ] Не равно.
Оператор обратный -eq.
[ 1 -ne 2 ] — True
[ 3 -ne 3 ] — False
-gt [ $x -gt $y ] Больше.
То есть проверяет больше ли x чем y.
[ 1 -gt 2 ] — False
[ 3 -gt 3 ] — False
[ 5 -gt 4 ] — True
-lt [ $x -lt $y ] Меньше.
Проверяет, что число в левой части (x) меньше числа в правой (y)
[ 1 -lt 2 ] — True
[ 3 -lt 3 ] — False
[ 5 -lt 4 ] — False
-ge [ $x -ge $y ] Больше или равно. [ 1 -ge 2 ] — False
[ 3 -ge 3 ] — True
[ 5 -ge 4 ] — True
-le [ $x -le $y ] Меньше или равно. [ 1 -le 2 ] — True
[ 3 -le 3 ] — True
[ 5 -le 4 ] — False

Пример использования в IF

if [ $x -eq $y ]
then
echo ‘true’
else
echo ‘false’
fi

Сравнение строк

Оператор Описание Пример
= [ «$a» = «$b» ] Равно.
То есть строка a равна строке b.
[ ‘linux’ = ‘windows’ ] — False
[ ‘unix’ = ‘unix’ ] — True
!= [ «$a» != «$b» ] Не равно.
Оператор обратный =.
[ ‘linux’ != ‘windows’ ] — True
[ ‘unix’ != ‘unix’ ] — False
=

$b ]] Содержит.
То есть в строке a есть b.
Обратите внимание, что для данного оператора используются двойные квадратные скобки. [[ ‘linux’ =

‘windows’ ]] — False
[[ ‘unix’ =

‘ni’ ]] — True -z [ -z $b ] Проверка на нулевой размер.
Оператор проверяет, является ли строка b с нулевым размером. [ -z ‘linux’ ] — False
[ -z » ] — True -n [ -n $b ] Проверка на ненулевой размер.
Оператор обратный -z. [ -n ‘linux’ ] — True
[ -n » ] — False [ $b ] Проверка на пустоту.
Оператор проверяет, является ли строка b не пустой. [ ‘linux’ ] — True
[ » ] — False -f [ $file ] Проверка на существование файла.
Оператор проверяет, существует ли файл $file. [ -f ‘/etc/filename’ ] — True
[ -f » ] — False

Пример использования в IF

if [ «$a» = «$b» ]
then
echo ‘true’
elif [[ «$a» =

$b ]]
then
echo ‘true’
else
echo ‘false’
fi

Несколько условий (логические операторы)

Оператор Описание Пример
-a [ $x -eq $y -a $z -le $w ] Логическое И.
В данном примере, проверяет, что (x равно y) И (z меньше или равно w)
[ 1 -eq 2 -a 3 -le 4 ] — False
[ 5 -eq 5 -a 3 -le 4 ] — True
[ 5 -eq 5 -a 6 -le 4 ] — False
-o [ $x -ne $y -o $z -ge $w ] Логическое ИЛИ.
В данном примере, проверяет, что (x не равно y) ИЛИ (z больше или равно w)
[ 1 -eq 2 -o 3 -le 4 ] — True
[ 5 -eq 5 -o 3 -le 4 ] — True
[ 5 -eq 5 -o 6 -le 4 ] — True
[ 1 -eq 2 -o 6 -le 4 ] — False

Дополнительно

Как написать IF в одну строку

if [ $x -ne 0 ]; then echo 1; fi

if [ $x -ne 0 -a $y -eq 1 ]; then echo 1; else echo 2; fi

Арифметические операции

Расчет можно выполнить одним из следующих методов:

sum=$(( $sum1 + $sum2 + $sum3 ))

sum=`expr $sum1 + $sum2 + $sum3`

* где операции могут быть следующие:

  • + — сложение;
  • — вычитание;
  • * — умножение;
  • / — деление;
  • % — остаток от деления;
  • = — приравнивание.

Ошибка «Integer expression expected»

Чаще всего, возникает при попытках использовать не тот оператор, например для строки -le (который должен использоваться для числа).

Примеры неправильного использования операторов:

Источник

if / then / else

Used to test multiple conditions and to execute more than a single command per condition. If the specified expr is true then the commands to the first else are executed; otherwise if expr2 is true then the commands to the second else are executed, etc. Any number of else-if pairs are possible; only one endif is needed. The else part is likewise optional.

The words else and endif must appear at the beginning of command lines; the if must appear alone on its command line or immediately after an else.

foreach / end

The foreach statement is a type of loop statement. The variable name is successively set to each member of wordlist and the sequence of commands until the matching end statement are executed. Both foreach and end must appear alone on separate lines.

while / end

The while statement is another type of loop statement. Statements within the while/end loop are conditionally executed based upon the evaluation of the expression. Both while and end must appear alone on separate lines.

break

Used to interrupt the execution of a foreach or while loop. Transfers control to the statement after the end statement, thus terminating the loop. If there are other commands on the same line as a break statement, they will be executed before the break occurs. Multi-level breaks are thus possible by writing them all on one line.

continue

Used to interrupt the execution of a foreach or while loop. Transfers control to the end statement, thus continuing the loop. If there are other commands on the same line as a continue statement, they will be executed before the continue occurs.

The goto statement transfers control to the statement beginning with label:

switch / case / breaksw / endsw

The switch structure permits you to set up a series of tests and conditionally executed commands based upon the value of a string. If none of the labels match before a `default’ label is found, then the execution begins after the default label.

Each case label and the default label must appear at the beginning of a line. The command breaksw causes execution to continue after the endsw. Otherwise control may fall through case labels and default labels. If no label matches and there is no default, execution continues after the endsw.

Interrupt handling

The onintr statement transfers control when you interrupt (CTRL-C) the shell script. Control is transferred to the statement beginning with label:

Can be useful for gracefully cleaning up temporary files and exiting a program should it be interrupted.

Using quotes


    The shell uses both single (‘) quotes and double («) quotes. They have different effects.

Single quotes:

  • allow inclusion of spaces
  • prevent variable substitution
  • permit filename generation

Double quotes:

  • allow inclusion of spaces
  • permit variable substitution
  • permit filename generation

Example 1: Variable substitution Example 2: Filename generation

Storing the output of a command

The shell uses backquotes to obtain the output of the command enclosed within the backquotes. This output can be stored within an array variable. Each element can then be indexed and processed as required.

Reading user input

Depending on your system, you can use either «$

This concludes the tutorial. Return to the Table of Contents

Источник

Командный интерпретатор Cshell

Содержание

Введение

Командный интерпретатор в среде UNIX выполняет две основные функции:

  • представляет интерактивный интерфейс с пользователем, т.е. выдает приглашение, и обрабатывает вводимые пользователем команды;
  • обрабатывает и исполняет текстовые файлы, содержащие команды интерпретатора (командные файлы);

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

В среде UNIX (в отличие, скажем, от DOS) имеются несколько различных командных интерпретаторов. Перечислим наиболее популярные:

  • /bin/sh — Bourne shell. Исторически это первая командная оболочка, разработанная для первой версии ОС UNIX. В настоящее время эта оболочка является основной в версиях UNIX System V.
  • /bin/csh — С-shell. Оболочка, синтаксис командного языка которой приближен к языку C. Является основной оболочкой для Берклеевской разновидности ОС UNIX.
  • /bin/ksh — k-shell.
  • /bin/rsh — Restricted shell. Представляет собой sh с ограниченными возможностями (прежде всего для защиты ОС от несанкционированных действий пользователя).

Операционная система ConvexOS является разновидностью 4.3 BSD UNIX( )BSD — Berkeley Series Distribution и, следовательно, базовой командной оболочкой является csh .

1 Основные возможности


Работа с командной строкой

Набираемую пользователем строку интерпретатор воспринимает как команду (или несколько команд). Синтаксис командного интерпретатора позволяет набирать

несколько команд в одной строке , разделяя их точкой с запятой. Например

эквивалентно двум последовательно введенным командам:

Наоборот, при желании пользователь может

продолжить набор длинной команды на следующей строке , закончив текущую строку знаком \\ . До завершения ввода команды вы будете получать «вторичное приглашение» &gt вместо основного ( % ). Например,

% tar tv Makefile star.o star.c star.dat main.o main.c

% tar tv Makefile star.o \

&gt star.c star.dat \

Управление потоками ввода-вывода осуществляется, подобно DOS(Точнее, синтаксис перенаправления потоков ОС DOS восприняла от UNIX) с помощью символов &gt , &gt &gt , &lt , &lt &lt , | . Отметим здесь только следующее: в отличие от DOS при создании программного канала между двумя процессами ОС UNIX запускает оба процесса одновременно и осуществляет передачу информации через системный буфер (без промежуточной записи на жесткий диск). Таким образом, программные каналы в ОС UNIX являются весьма эффективным способом обмена. В случае переполнения системного буфера (например если «передающая» программа выдает информацию в канал быстрее чем ее может обработать «принимающая» программа) ОС автоматически приостанавливает тот процесс, который осуществляет запись в канал до освобождения буфера.

Полезный частный случай использования механизма перенаправления потоков — перенаправление в /dev/null , что позволяет избавиться от ненужных сообщений на экран. С помощью того же механизма можно создавать пустые файлы:

% cat &lt /dev/null &gt myfile

создаст в текущей директории пустой файл myfile .

Дополнительно C-shell позволяет группировать команды с помощью круглых скобок. В этом случае вся конструкция внутри скобок рассматривается интерпретатором как одна команда. Сие полезно, например, в таких конструкциях:

% (command1 | command2) &lt myfile

Если же скобки опустить, shell не сможет определить какой из команд вы хотите подать на вход файл myfile .

Следующие «удобства» существуют в данной реализации C-shell:

  • Вы можете не набирать длинную команду до конца, а попробовать после частичного набора команды (или имени файла) нажать клавишу табуляции &lt Tab&gt . C-shell попытается сама дополнить недостающие символы, либо ответит писком, если выбор неоднозначен.
  • Если вы набрали команду, но забыли ее опции, наберите последовательность &lt Esc&gt H . C-shell выдаст краткую помощь. Например,
  • Набирая полное имя файла пользуйтесь комбинацией клавиш ^D . Вы сможете получить листинг набираемого каталога в формате команды lf .
  • Командный буфер запоминает 20 последних команд. Вместо набора команды вы можете вызвать ее из буфера с помощью стрелочной клавиатуры (конечно только в том случае, если эта команда есть в буфере).

Разбор командной строки

, < , >)

  • Подставляет переменные shell
  • Выполняет команду, если она — встроеная команда интерпретатора, или запускает процесс, если команда внешняя.
  • Разберем эти действия по этапам.

    Псевдонимы (alias) . Встроенная команда alias позволяет определять псевдонимы команд. Пример:

    % alias mycat ‘cat | more’

    определяет mycat как псевдоним строки cat | more . Поэтому далее вы вправе пользоваться командой mycat , которая будет раскрыта интерпретатором везде, где вы ее используюте. Это — способ определения коротких имен для длинных составных команд.

    Встроенная команда unalias mycat уничтожает ранее введенный псевдоним mycat .

    Метасимволы . Метасимволы позволяют кратко записывать целые списки слов (главным образом — имен файлов). Shell рассматривает слово, в котором встречаются метасимволы, как шаблон для составления списка имен файлов:

    • * в шаблоне заменяет любую последовательность символов. Например m* раскроется в список всех файлов, начинающихся с буквы m . Существует небольшое исключение из этого правила: просто * опускает в списке те файлы, имена которых начинаются с точки.
    • ? заменяет один символов. Например m? раскроется в список всех имен файлов, начинающихся с буквы m и состоящих точно из двух букв.
    • [.-.] позволяет указать интервал для подставляемого символа. Например m[a-e] будет раскрыто в ma mb mc me .
    • < . >позволяет перечислить слова для подстановки. Так, например m будет раскрыто в mred mblue mgreen .

    Наконец, тильда позволяет указать домашний каталог пользователя:


    name/ эквивалентно указанию полного пути в домашний каталог пользователя name (Скажем, /usr1/name/ )

    / эквивалентно указанию полного пути в ваш собственный домашний каталог.

    Переменные shell . Слова, начинающиеся с символа $ командный интерпретатор воспринимает как имена переменных. Переменные делятся на переменные окружения (они будут известны всем вызванным из этой shell программам и являются в этом смысле глобальными) и простые переменные.

    Встроенная команда set name=value позволяет определить простую переменную с именем name и дать ей значение value . Встретив в командной строке выражение $name интерпретатор заменит его на value . Например,

    Команда unset уничтожает ранее определенные переменные.

    Чтобы определить переменную равной строке из нескольких слов, заключите ее в простые кавычки. Пример

    Простые переменные могут быть массивами слов (что надо отличать от только что рассмотренного случая, когда переменная содержит строку из нескольких слов. Для объявления массива надо использовать круглые скобки:

    Возможны довольно сложные комбинации с использованием шаблонов, например:

    Переменные окружения вызываются точно также как и простые переменные. Разница заключается в способе их определения:

    Команда % setenv name value устанавливает переменную окружения с именем name . Обратите внимание на раздражающую разницу в синтаксисе: определяя переменную окружения не надо ставить знак = .

    Список всех переменных окружения можно получить с помощью встроенной команды printenv .

    Отменить определения переменной окружения можно с помощью unsetenv .

    Наконец, для определения массива переменных окружения НЕ используются круглые скобки, а используются двоеточия в качестве разделителей элементов массива:

    Встроенные команды и переменные

    Список важнейших встроенных команд C-shell с краткими пояснениями:

    • alias определяет псевдоним
    • bg переводит задачу в фоновый режим исполнения
    • chdir path команда перехода в каталог path .
    • echo выводит на стандартный вывод все свои аргументы
    • exec filename запускает процесс из файла filename вместо текущей shell (т.е. поверх нее). Возврат в shell невозможен.
    • exit заканчивает работу shell .
    • fg переводит фоновый процесс в синхронный.
    • file filename выдает информацию о том, что операционная система думает об этом файле.
    • goto label осуществляет безусловный переход на строку командного файла, помеченную меткой label . Не используется в интерактивном режиме.
    • kill pid посылает сигнал аварийного завершения процессу с номером pid , что обычно приводит к уничтожению процесса.
    • source filename считывает и исполняет команды из файла filename .
    • set , setenv установка внутренних переменных и переменных окружения.
    • shift var сдвигает элементы массива var влево. При этом размер массива уменьшается на единицу, а нулевой элемент массива теряется. Переменная var должна быть массивом.
    • time command выполняет команду command и выводит на терминал затраченное на ее выполнение время.
    • unset уничтожает переменную shell .
    • unalias уничтожает ранее определенный псевдоним команды.
    • @ name = expr заносит результат арифметического выражения expr в переменную name .

    Список важнейших встроенных переменных C-shell с краткими пояснениями:

    • argv массив параметров командной строки (используется в командном режиме)
    • cdpath каталог, куда shell переходит, получив команду chdir без аргумента.
    • history размер буфера для запоминания команд.
    • home домашний каталог пользователя
    • mail местоположение в файловой системе почтового ящика пользователя.
    • path путь поиска внешних команд.
    • prompt основное приглашение shell .
    • prompt1 вторичное приглашение.
    • shell полный путь исполняемого файла текущей оболочки ( /bin/csh )

    Управляющие операторы и операторы цикла


    Условное выполнение

    Синтаксис условного оператора if в C-shell таков

    В качестве expr может стоять либо арифметическое выражение, либо проверка атрибутов файла. Пример:

    -r доступен на чтение

    -w доступен на запись

    -x доступен на исполнение

    -e проверка существования файла

    -o проверка что вы являетесь хозяином данного файла

    -z файл имеет нулевой размер

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

    -p файл является именованным программным каналом

    -d файл является директорией

    Цикл while

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

    Цикл foreach

    Это чрезвычайно полезный оператор, позволяющий организовать цикл по элементам массива слов

    foreach varname ( list )

    Тело цикла выполняется столько раз, сколько элементов в массиве list . При этом переменная varname содержит очередное значение элемента массива. Пример

    Многовариантный условный оператор

    case pattern1 : . breaksw case <\it pattern2>:

    Оператор позволяет передавать управление в зависимости от того, удовлетворяет ли строка string какому-либо шаблону из набора pattern1 , pattern2 , . ( в этом случае управление передается в блок, ограниченный case . breaksw ) или нет (в этом случае управление передается на ветвь default: . endsw . В целом, оператор switch очень похож на аналогичный опреатор языка C. Такие конструкции часто используются в командных файлах для анализа ответа пользователя на заданный вопрос ( [Yes/No] ).

    2 Работа оболочки в командном режиме

    Уже отмечалось, что csh может быть запущена в командном режиме. Более того, условные операторы и операторы цикла чаще используются именно в командных файлах. Здесь мы рассмотрим особенности такой «командной» работы.

    Идентификация интерпретатора

    % chmod +x mycommand

    Теперь достаточно ввести с клавиатуры команду mycommand и ОС автоматически запустит shell в командном режиме исполнения данного файла. В таком пути есть один подводный камень: командных интерпретаторов в системе много и синтаксис команд у них разный. Как ОС определит нужный вам? Ответ — никак. Вы должны явно указать ОС какой интерпретатор вы хотите запускать для исполнения данного командного файла. Для этого первая строчка вашего файла должна иметь следующий стандартный вид:

    что и позволит ОС правильно поступить. Если же вы не задали этой информации, то ОС будет считать (по историческим причинам), что файл написан на языке Bourne shell и вы вероятнее всего получите множество сообщений о синтаксических ошибках.

    Заметим еще одно полезное свойство работы оболочки в командном режиме: все строки, начинающиеся со знака # будут проигнорированы. Это позволяет вносить в текст командного файла комментарии.

    Следующий факт позволяет вам работать с командной строкой средствами csh : при запуске командного файла mycommand автоматически становится определенной внутренняя переменная с именем argv , представляющая массив параметров командной строки. Например, следующий командный файл просто выводит все свои аргументы и их количество на терминал:

    Явный запуск

    % /bin/csh -c mycommand arg1 arg2 arg3 .

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

    Кавычки

    Простые кавычки используются для выделения текста, который оболочка должна понимать буквально. Иными словами, текст внутри простых кавычек не подлежит раскрытию и интерпретации. Пример:

    echo ‘Dollar is $good’

    получим букально Dollar is $good несмотря на то, что знак доллара является метасимволом оболочки.

    Двойные кавычки выделяют строку символов, которую оболочка будет считать одним словом. Пример:

    set colors=»green blue red»; echo $#colors

    выдаст цифру 1, что означает, что переменная colors простая, а не массив. Все что находится внутри двойных кавычек подлежит интерпретации оболочкой.

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

    занесет в переменную mytty ту строку, которую выдает команда tty (а именно имя и номер текущего терминала).

    Источник

    Читайте также:  Genius k641 драйвера windows 10
    Оцените статью