The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Shell-кодинг (shell)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: shell,  (найти похожие документы)
From: iNo <ino@kodsweb.ru.> Newsgroups: email Date: Mon, 24 Oct 2007 14:31:37 +0000 (UTC) Subject: Shell-кодинг ---------------------------------------------------------------------- # # # Author: iNo // k0dsweb gr0up # # Статья является собственностью команды KodsWeb # # (www.kodsweb.ru) # # -= 06.09.2006 =- # # # # # # Shell-кодинг. # # # Intro... В данной статье я вкратце опишу shell-программирование,рассмотрю простейшие примеры и прокомментирую их.Сразу оговорюсь,что эта статья не является исчерпывающим руководством по shell- программированию.Но её будет достаточно чтобы освоить его основы. Несмотря на кажущуюся простоту shell-программирования,оно является достаточно мощным инструментом администратора unix-системы.Замечу,что для полноценного администрирования unix-системы,уметь программировать на shell просто необходимо. Все примеры протестированы на системе Slackware Linux 10.2 и полностью работоспособны. Общие положения. Комментарии начинаются с символа #,за исключением первой строки. Первой строкой сценария является путь к интерпретатору,начинающийся с #! с помошью которого будет запущен данный скрипт.Например: #!/bin/sh #А вот это уже комментарий Переменные,ввод и вывод данных. Для задания переменных используется оператор присваевания "=".Синтаксис следующий: <переменная>=<значение> Замечу,что в отличие от языков perl и php,между знаком "=" и остальными параметрами нельзя ставить пробел.В этом случае интерпретатор выдаст ошибку.Чтобы обратится к заданной переменной ,надо вызвать её поставив перед ней знак $.Удалить переменную можно с помощью оператора unset. Оператор Echo просто выводит строку(или переменную), идущую после него: #!/bin/sh var=Vasya echo $var >--------------------------------------< Vasya >--------------------------------------< #!/bin/sh echo My name is Vasya >--------------------------------------< My name is Vasya >--------------------------------------< В данный пример также можно добавить одинарные или двойные кавычки, от этого результат работы программы не изменится.Но не стоит использовать обратные кавычки,т.к.эти символы используются для выполнения команд: #!/bin/sh echo `My name is Vasya" >--------------------------------------< Error: My: command not found >--------------------------------------< #!/bin/sh echo 'ls -a' >--------------------------------------< . .. .bash_history script.sh >--------------------------------------< Оператор read присваевает значение переменной.Вот пример,который просит ввести переменную var,считывает её а затем выводит. #!/bin/sh echo "Input var:" read var echo "The var is $var" >--------------------------------------< Input var: 123 The var is 123 >--------------------------------------< Агрументы командной строки. Как и во всех консольных программах, в shell-сценарий можно передавать аргументы из командной строки.Переменные $1..$9 соответствуют параметрам, переданным из командной строки сценарию.Переменная $0 содержит имя интерпретируемого файла.$#-содержит количество переданных аргументов. $* и $@ содержат все аргументы,но в $@ все аргументы выделены кавычками. Напишем скрипт,который выводит 2 аргумента командной строки и имя исполняемого файла.Запуск скрипта: ./script.sh 1 2 #!/bin/sh echo "Name:$0" echo "First argument:$1" echo "Second argument:$2" >--------------------------------------< Name:./script.sh First argument:1 Second argument:2 >--------------------------------------< Арифметические операции. Арифметические операции производятся с использованием оператора let. Операции: * - умножение / - деление + - сложение - - вычитание % - деление с остатком Синтаксис: let <значение> <оператор> <значение> Пример: #!/bin/sh let res=2*7 echo $res >--------------------------------------< 14 >--------------------------------------< Оператор test или []. Данные операторы предназначены для выполнения сравнений двух значений. Если сравнение успешно-оператор возвращает 0,иначе 1.Код завершения последней выполненной команды хранится в специальной переменной $?. Синтаксис: test <значение> -опция <значение> или [<значение> -опция <значение>] Пример: #!/bin/sh var=10 [ $var -eq 8 ] echo $? >--------------------------------------< 1 >--------------------------------------< Ниже приведены все опции оператора test(или []): Сравнение целых чисел: -gt больше чем -lt меньше чем -ge больше чем либо равно -le меньше чем либо равно -eq равно -ne не равно Сравнение строк: -z проверка на наличие пустой строки -n проверка на наличие строки-значения = равенство != неравенство str проверка на наличие строки,состоящей из нулей Логические операции: -a И -o ИЛИ ! НЕ Проверка файлов: -f установка факта существования файла и его регулярности -s проверка,не является-ли файл пустым -r проверка возможности считывания файла -w проверка возможности записи файла -x проверка исполняемости файла -d проверка,является-ли файл каталогом -h проверка,является-ли файл ссылкой -c проверка,является-ли файл байт-ориентированным устройством -d проверка,является-ли файл блок-ориентированным устройством Условия. Ниже описан синтаксис всех условных операторов,с примерами. 1)if <команда> then <команда> fi Пример: #!/bin/sh if [ $1 -eq 10 ]; then echo var=10 fi Результат работы,при переданном параметре равном 10: >--------------------------------------< var=10 >--------------------------------------< 2)if <команда> then <команда> else <команда> fi Пример: #!/bin/sh if [ $1 -eq 10 ]; then echo var=10 else echo var!=10 fi Результат работы,при переданном параметре равном 10: >--------------------------------------< var=10 >--------------------------------------< Результат работы,при переданном параметре равном 7: >--------------------------------------< var!=10 >--------------------------------------< 3)if <команда> then <команда> elif <команда> else <команда> fi Пример: #!/bin/sh if [ $1 -eq 10 ]; then echo var=10 elif [ $1 -eq 9 ]; then echo var=9 else echo var!=10 and var!=9 fi Результат работы,при переданном параметре равном 10: >--------------------------------------< var=10 >--------------------------------------< Результат работы,при переданном параметре равном 9: >--------------------------------------< var=9 >--------------------------------------< Результат работы,при переданном параметре равном 8: >--------------------------------------< var!=10 and var!=9 >--------------------------------------< 4)case <строка> in <шаблон>) <команды> ;; *) <команды> ;; esac Case-конструкция позволяет выбирать один из нескольких альтернативных вариантов. #!/bin/sh case $1 in 1) echo arg is 1 ;; 2) echo arg is 2 ;; *) echo arg is other ;; esac Результат работы,при переданном параметре равном 1: >--------------------------------------< arg is 1 >--------------------------------------< Результат работы,при переданном параметре равном 2: >--------------------------------------< arg is 2 >--------------------------------------< Результат работы,при переданном параметре равном 10: >--------------------------------------< arg is other >--------------------------------------< Циклы. 1)while <условие> do <команды> done Выполняет команды пока условие истино. Пример: #!/bin/sh cont=yes while [ $cont = yes ] do echo -n "continue?" read cont done >--------------------------------------< continue? yes continue? no >--------------------------------------< 2)until <условие> do <команды> done Выполняет команды пока условие ложно. Пример: #!/bin/sh cont=yes until [ $cont = no ] do echo -n "continue?" read cont done >--------------------------------------< continue? yes continue? no >--------------------------------------< 3)for <переменная> do <команды> done Выполняет команды для каждого параметра,который был передан сценарию в командной строке. Пример: #!/bin/sh for var do echo $var done Результат работы программы,с параметрами 1 2 3 4 5: >--------------------------------------< 1 2 3 4 5 >--------------------------------------< 4)for <переменная> in <строка> do <команды> done Эта конструкция отличается от обычного for тем,что параметры берутся не из командной строки,а из строки после оператора in. 5)select <строка> in <перечень элементов> do <команды> done Конструкция select создаёт меню на основе элементов заданного списка,а затем выполняет для него указанную команду. Пример: #!/bin/sh select var in 1 2 3 do case $var in 1) echo Number 1 ;; 2) echo Number 2 ;; 3) echo Number 3 ;; *) echo Other ;; esac done >--------------------------------------< 1) 1 2) 2 3) 3 #? 3 Number 3 #? _ >--------------------------------------<

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, andrey (??), 13:57, 26/10/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > сравнение строк
    > ...
    > =       равенство

    ошибка

     
  • 1.2, root (??), 18:57, 26/10/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    #!/bin/sh
    let res=2*7
    echo $res

    ошибка - оно будет выводить дважды ответ "14"

     
  • 1.3, root (??), 18:59, 26/10/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    #!/bin/sh
    echo 'My name is Vasya"

    выведет что не найдена закрывающая кавычка.

     
  • 1.4, root (??), 19:00, 26/10/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Опять пишем банальные истины?:(
     
  • 1.6, naquad (??), 03:46, 07/11/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    бож.... ну что теперь каждый считает своим долгом отписать какую-то статью на мега затёрто-банальную тему? :(
     
  • 1.7, andrew (??), 14:38, 17/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    select во фрибсд по крайней мере нету в /bin/sh
     
  • 1.8, shellunit (?), 16:53, 18/12/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кому то это статья очень сильно поможет ))).
    Начинающему кодеру в самый раз. Так держать.
     
  • 1.9, Hyston (?), 00:14, 01/02/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Чайник сел за линукс, статья помогает, один вопрос: Это всё куда вбивать?? В текстовый файл? В винде это называлось батниками, блин..
     
     
  • 2.11, vladd (??), 20:32, 15/02/2008 [^] [^^] [^^^] [ответить]  
  • +/
    В любой своей директории набери:
    $ touch test
    $ chmod 755 test
    Впиши или скопируй в файл "test" текст кода из статьи и выполни его так:
    $ ./test
     
  • 2.12, vladd (??), 20:34, 15/02/2008 [^] [^^] [^^^] [ответить]  
  • +/
    В любой своей директории набери:
    $ touch test
    $ chmod 755 test
    Впиши или скопируй в файл "test" текст кода из статьи и выполни его так:
    $ ./test
     
  • 2.13, vladd (??), 20:37, 15/02/2008 [^] [^^] [^^^] [ответить]  
  • +/
    В любой своей директории набери:
    $ touch test
    $ chmod 755 test
    Впиши или скопируй в файл "test" текст кода из статьи и выполни его так:
    $ ./test
     

  • 1.10, vladd (??), 20:17, 15/02/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья нужная.
     
  • 1.14, Kazm (?), 11:44, 08/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как выйти из цикла for? не выходя из скрипта?
    exit выводит из скрипта полностью...
     
     
  • 2.15, naquad (??), 11:48, 08/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >Как выйти из цикла for? не выходя из скрипта?
    >exit выводит из скрипта полностью...

    break - убивает _последний_ цикл
    т.е.

    for x in ...
    do
         for i in ...
         do
              # выйдет только из цикла for i in ...
              [ "$i" = "123" ] && break
         done
    done

    continue - переходит к следующей итерации (так же только для последнего цикла)

     
     
  • 3.16, naquad (??), 11:53, 08/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >>Как выйти из цикла for? не выходя из скрипта?
    >>exit выводит из скрипта полностью...

    ещё маленькое дополнение: у них есть параметр уровень (он опциональный), им можно рулить
    какой цикл остановить или перейти на след. итерацию:

    for x in ...
    do
         for i in ...
         do
             # остановит for x in ...
             [ "$i" = "123" ]&&break 1
         done
    done

     

  • 1.17, SSSSSSSSS (?), 01:52, 14/06/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    поможет она тем кто хочет сдать зачёт по операционным системам и ответить на вопрос по этому сраному шелу
     
  • 1.18, kass (?), 12:00, 21/08/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    как уже говорили выше - начинающему она поможет!
    автору спасибо!
     
  • 1.19, bash (??), 11:14, 15/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    отличная статья, особенно для начинающих
     
  • 1.20, Markiz (??), 12:49, 22/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья прекрасная. Для начинающих лучше не придумаешь. Хотелось бы только дополнительного освещения чтения и записи в файлы. :)
     
  • 1.21, shaq (?), 12:46, 02/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья отличная, реально помогла!!!
     
  • 1.22, Ы (?), 18:19, 14/01/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    спасибо
     
  • 1.23, Mximu (?), 09:07, 11/10/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пишу второй или третий в жизни скрипт (простенький). Статья то, что надо. Спасибо людям за то, что дали ссыль на неё. Реально время сэкономил. Адназначна на жестяк, в загашник!
     
  • 1.24, Лещ (?), 15:52, 20/11/2014 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья хороша тем, что можно быстро найти то что надо. Это ускорит написание некоторых shell-скриптов, особенно для начинающих.
     
  • 1.25, Belk (??), 17:48, 09/03/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо, все четко и без воды. Для начала - самое то
     
  • 1.26, Вовка (??), 21:49, 04/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо.
     
  • 1.27, Патрик (?), 11:47, 06/05/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Четко, спасибо.
     
  • 1.28, Victorr (?), 14:36, 02/02/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Лайк
     

    игнорирование участников | лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру