FAQ Shell::Журнал СА 4.2003
www.samag.ru
Журнал «БИТ. Бизнес&Информационные технологии»      
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Работа с Debian  

О Linux с любовью или Debian: через знание к любви

Конечно, одним лишь перечислением замечательных качеств любовь к Linux не возникнет. Для

 Читать далее...

Опрос  

Защита личных и клиентских данных: как мошенники используют ИИ и как защититься?

По данным RED Security, общее число кибератак на российские компании в 2024

 Читать далее...

Опрос  

Облачные инструменты для разработчиков

Эксперты ИТ-отрасли отвечают на вопросы «Системного администратора» > Как с помощью облака сделать

 Читать далее...

Опрос  

Рынок мобильных приложений: что будет актуальным в 2025 году?

Эксперты ИТ-отрасли отвечают на вопросы «Системного администратора» > Ваши прогнозы: чего ожидать от

 Читать далее...

Рынок труда  

Как успешно пройти все этапы собеседования на ИТ-должность?

По оценкам государства, дефицит ИТ-специалистов составляет от 740 тысяч до 1 миллиона

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 7473
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 7734
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 5101
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3293
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 4090
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 4094
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6595
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3440
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3712
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7583
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10954
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12673
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 14434
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9392
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7352
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5640
Комментарии: 4
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4855
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3709
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3391
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3611
Комментарии: 1
Рецензия на книгу «MongoDB в действии»

 Читать далее...

Друзья сайта  

 FAQ Shell

Архив номеров / 2003 / Выпуск №4 (5) / FAQ Shell

Рубрика: Программирование /  Автоматизация

ВСЕВОЛОД СТАХОВ

FAQ Shell

Как присвоить переменной результат выполнения команды?

Вопрос можно истолковать по-разному. Если имеется в виду присвоить переменной код завершения программы, то используется следующий синтаксис:

./some_prog RESULT=$?

На практике чаще используется проверка правильности выполнения последней команды с помощью переменной $? (при успешном завершении обычно возвращается нуль):

./some_prog

if [ $? ne 0 ]

then

echo Bad exit code

exit

fi

У некоторых возникнет искушение сделать нечто подобное:

echo Error!!! exit $?

Но к сожалению, такой вариант всегда возвращает нуль, т.к. последней командой было echo. В качестве решения проблемы можно присваивать код завершения сомнительной программы некой переменной, а потом безбоязненно с ней обращаться (учтите, операторы проверки [] также изменяют код завершения). Если же в данном вопросе имелся в виду не код завершения программы, а то что было выведено программой в stdout, тогда необходимо заключить команду в обратные кавычки:

DATE=`date`

Где можно найти полное описание встроенных переменных bash?

http://ln.com.ua/~openxs/projects/man/solaris8/ bash.html#variables

Существует ли простой способ программно создать файл, содержащий несколько строк?

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

cat > cfg <

name = $a

And this file was generated with $EDITOR many other

lines... ...

EOT

Как выполнять арифметические действия над переменными?

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

let a=6 let b=a*2 let c=a%4 let d=c/2 echo a=$a echo b=$b echo c=$c echo d=$d

Результат работы:

a=6 b=12 c=2 d=1

Второй способ – оценка cтроковых выражений командой expr:

$a=2 $b=2 expr $a + $b

Выведет число 4. Заметьте, что просто $a + $b будет преобразовано в 2 + 2.

Что означают перенаправления в циклах?

Смысл такой: после каждого шага цикла значение переменной цикла считывается или передаётся в конвейер. Пример удаления всех исполняемых файлов, если им соответствуют файлы .c (т.е. удаление объектных файлов):

for x in *; do [ -x $x -a -f $x.c ] && echo $x; done | xargs rm -f

Заметьте, что если последняя команда цикла ложна, то перенаправления переменной цикла не происходит. В данном примере используется именно эта возможность.

Как экранировать кавычки?

Вопрос заслуживает отдельного внимания, например, когда внутри кавычек есть другие кавычки:

  • двойные (") – экранируются обратным слэшем, например echo """ выведет просто символ ";
  • одинарные (") – обратный слэш не спасает – приходится использовать восьмеричный код символа 047: echo "?47$PATH?47" выведет "$PATH", в Linux необходимо для echo указать опцию -е;
  • обратные (`) – экранируются аналогично двойным, т.е. обратным слэшем.

Как работать с интерактивными программами, напри­мер, telnet или ftp?

Вопрос не относится непосредственно к shell, для решения этой задачи удобно использовать специальный пакет функций tcl -expect (http://expect.nist.gov). Данный пакет содержит функции:

  • spawn – породить процесс;
  • send – послать процессу входные данные;
  • expect – в зависимости от выводимых данных послать процессу некие входные данные.

Простой пример – получение файлов по ftp в автоматическом режиме:

spawn /usr/bin/ftp ftp.myhost.ru

expect{

"Name*: " {send "username "}

"Password:" {send "user_password "}

"failed" {puts "Can`t login."; exit 1}

}

send "lcd /etc "

expect "ftp> " {send "cd /pub/etc "}

expect "ftp> " {send "get passwd "}

expect "ftp> " {send "quit "}

exit 0

Работа с telnet и ssh также не должна вызвать затруднений (кроме автокоманд на сервере, выполняемых при запуске командного интерпретатора). А вообще, expect – это очень полезный инструмент, позволяющий автоматизировать интерактивные операции (учтите, что для его работы необходим tcl).

Как узнать, в командном или интерактивном режиме ра­ботает shell?

Можно проверить специальную переменную $- или переменную $PS1. Для первого случая можно использовать скрипт, подобный такому:

case $- in

*i*) # eioa.aeoeaiue .a.ei

     ;;

*)   # iaeioa.aeoeaiue .a.ei

     ;;

esac

Проверка режима оказывается полезной при написании сценариев, когда неизвестно, необходимо ли выводить в stdout или stderr какие-либо данные (нет смысла в неинтерактивном режиме). Также полезно применять в инициализационных сценариях оболочки (например, чтобы выполнение отдельных команд через ssh или rsh не вызывало запуск кучи вспомогательных программ). Для оболочки C (csh, tcsh) синтаксис проверки будет несколько иным:

if(! $?prompt)

# iaeioa.aeoeaiay iaiei.ea

exit

else

# eioa.aeoeaiay iaiei.ea

echo Hi

exit

endif

А почему большинство скриптов написано на Bourne shell? Почему моя любимая tcsh обойдена вниманием?

Скажу к слову, tcsh – это и моя любимая оболочка, я работаю в ней, как в интерактивной, но скрипты всегда пишу в Bourne shell. Причина проста: скрипты на Bourne shell больше распространены, и любому администратору необходимо знать эту оболочку, по ней есть много документации, в том числе и на русском языке. Программировать в C-shell несколько привычнее, но многочисленные ошибки реализации языка (особенно в классическом csh) сильно затрудняют работу. В частности, не очень удобен механизм перенаправлений:

sh:

mpg123 ./*.mp3 > /dev/null 2>&1

csh:

mpg123 ./*.mp3 > /dev/null) >& /dev/null

В оболочке C практически невозможно нормально разделить stdout и stderr.

В моей системе нет команды killall. Что можно придумать?

Пишем примерно такой сценарий:

#!/bin/sh

kill $1 `ps ax | grep $2 | awk "{print $1}"| sed "s/ / /g"`

Вызываем скрипт так:

killall -9 ftpd

Один минус: убивается больше процессов, чем нужно, т.к. grep находит сам себя и пытается убить лишние процессы. Хотя это не смертельно, но если такого процесса нет, то программа всё равно выводит Killed. Поэтому вывод надо дополнительно фильтровать, но мне было вполне достаточно такого варианта.

Как найти в /etc/passwd записи с нулевым UID (кроме root)?

#/bin/sh

for i in `awk -F: "{if($3 == "0" && $1 != "root") print $1}"

/etc/passwd`

do

mail -s "Strange user!" root@mymail.net << EOT

There is a user ${i} that has uid = 0

`date`

EOT

done

Удобно добавить этот скрипт в crontab (учтите, что используется gawk -параметр -F могут не понять старые версии awk, в таком случае внутри awk-скрипта надо установить FS=":").

В чем состоят отличия различных оболочек?

Сравнительная таблица наиболее известных оболочек может быть найдена на http://www.looking-glass.org/shell.html. Одной из наиболее функциональных оболочек является zsh (хотя за функциональность приходится расплачиваться некоторой потерей быстродействия). Для большинства операций обычно достаточно bash или tcsh. Вообще существует два типа оболочек – произошедшие от Bourne shell (sh, bash, ksh, zsh) и произошедшие от C-shell (csh, tcsh). Отличия в синтаксисе оболочек весьма существенны. Оболочки, произошедшие от Bourne shell, чаще используются для программирования, так как язык C-shell далёк от совершенства (хотя я бы не сказал, что tcsh многим уступает в возможностях программирования bash, но исторически csh обладал кучей огрехов, поэтому сейчас более распространён синтаксис Bourne shell). Оболочки С-shell всегда являлись больше интерактивными оболочками, но язык их скриптов намного ближе тем, кто знаком с языком С. К сожалению, русской документации по C-shell я не встречал. Может быть, в скором времени этот пробел будет заполнен.

Существует ли руководство по bash на русском языке?

Да, есть:

Как работают текстовые замены и подстановки в bash?

Вообще текстовые замены и подстановки – это одна из самых мощных возможностей bash (в оригинальной sh эти возможности сильно урезаны). Существует несколько типов текстовых подстановок командной строки:

  • фигурные скобки – всё, что находится в командной строке в фигурных скобках {}, расценивается как шаблон для поиска, объединённый командой ИЛИ: file{1,2} заменится на file1 file2 chown root /usr/{ucb/{ex,edit},lib/ {ex?.?*,how_ex};
  • подстановка $ – все, что идёт после данного символа расценивается как значение переменной или результат выполнения команды. Также полезно окружать подстановку после $ фигурными скобками (отделение от остальной части текста): echo "${HOME} – this is where you files are". echo ${`date`};
  • подстановка процессов;
  • подстановка имён файлов;
  • разбиение переменных на слова – по умолчанию интерпретатор разбивает все переменные и результаты выполнения команд, не заключённые в двойные кавычки, на слова, что позволяет обрабатывать переменные в циклах по полям.

Существует достаточно много дополнительных параметров подстановки (например, подстановка подстрок или установка переменной по умолчанию), но охватить всё в рамках данного вопроса явно не удастся, за дополнительными сведениями обращайтесь к документу http://ln.com.ua/ ~openxs/projects/man/solaris8/bash.html#expansion.

В чем отличие различных кавычек в shell?

Кавычки – это очень полезный инструмент. Различные виды кавычек применяются в различных случаях (учтите, кавычки сохраняют своё значение и в интерактивной оболочке). Итак, какие бывают кавычки:

  • двойные (") – внутри таких кавычек происходят все текстовые подстановки (см. ниже), в том числе и подстановка обратных кавычек. Например, echo "$PATH" выведет значение переменной PATH, а echo "${PATH} `date`" выведет значение PATH, поставит пробел и подставит результат выполнения программы date;
  • одинарные (") – внутри одинарных кавычек всё печатается как есть, без подстановок: echo "$PATH" выведет $PATH;
  • обратные (`) – подставление вывода указанной в кавычках команды, также выполняются все подстановки: `ps aux | grep $1` – выведет список заданных в аргументе $1 процессов. Учтите, что результатом могут быть несколько строк.

Как прочитать несколько строк с терминала?

Для этого используется цикл while с командой read. Стандартное решение:

while read line

do echo $line

done

Можно выполнять построчное чтение не с терминала, а из файла – для этого достаточно выполнить перенаправление цикла:

while read line

do echo $line

done < /etc/passwd

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

Будет ли продолжение данного FAQ?

Задавайте ваши вопросы мне: CEBKA@smtp.ru. Наиболее интересные войдут в этот список.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru