программирование сценариев bash

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

программирование сценариев bash

Непрочитанное сообщение Olej » 28 окт 2011, 18:37

Это должен уметь каждый ... линуксоид :!: ;-)

Но как показывают обсуждения и разговоры - это далеко не так.

Поэтому я помещаю здесь URL лучшего руководства по языку программирования bash:
http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Искусство программирования на языке сценариев командной оболочки
Автор: Mendel Cooper
Перевод: Андрей Киселев


Есть много руководств по shell, но это (поверьте - по опыту) - лучшее, потому как:
- его очень легко использовать как справочное руководство под рукой...
- там много по-ходу совершенно нетривиальных примерчиков...
- и это замечательно сделанный перевод
(у меня вообще по русскоязычным книгам бумажным и русскоязычному интернет складывается впечатление, что есть переводы, сделанные Андреем Киселевым и ... все остальные переводы :lol: ).

P.S. мне понадобилось написать несколько скриптов, для измерения вот здесь: viewtopic.php?f=5&t=1531&p=2376#p2376 ... и забылись некоторые конструкции, я воспользовался этим справочником ... и вспомнил, что его есть смысл порекомендовать.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 18 ноя 2011, 15:58

... и раз уж речь зашла о bash :lol: ... (чтоб тему отдельно не заводить)...
то решил я вписать для памятки себе (и может ещё кому пригодится) несколько не очевидных приёмов работы с bash с консоли, ввод комбинаций, которые сильно ускоряют работу с командной строкой:

1. "дополнение командной строки" <Tab> ... ну, это все знают ;-)
Но вот то, что 2-х кратным <Tab><Tab> в начале командной строки выведет список всех команд - это упускается из виду ... ну, всех это многовато будет, но вот если забыл написание какой-то редко используемой команды (забыл как touch пишется ;-) ), то сильно помогает - вводим начальные символы команды (которые ещё помнятся) + <Tab> (или <Tab><Tab>):

Код: Выделить всё

[olej@notebook ~]$ t<Tab><Tab>
Display all 156 possibilities? (y or n)
t1libconfig              tcpd                     texhash                  tiffinfo                 transmission
tabs                     tcpdump                  texlinks                 tiffmedian               transmissioncli
tac                      tcpslice                 texsis                   tiffset                  transmission-remote
tagtool                  tcsh                     text2wave                tiffsplit                trap
tail                     tctmgr                   tfmtodit                 tifftopnm                tree
tailf                    tctmttest                tftopl                   time                     trial
talk                     tcttest                  tftp                     timeout                  troff
tangle                   tcucodec                 tgatoppm                 times                    true
tap2deb                  tcumttest                tgz                      tload                    truncate
tap2rpm                  tcutest                  tha                      tmpwatch                 try-from
tapconvert               teamviewer               then                     tnameserv                tset
tapdisk                  teamviewer6              thinkjettopbm            toc2cddb                 tsort
tar                      tee                      thumbnail                toc2cue                  ttusb_dec_reset
taskset                  tek2plot                 thumbpdf                 toe                      tty
tasque                   telinit                  thunar                   togglesebool             tunctl
tbl                      telnet                   thunar-settings          tomboy                   tune2fs
tc                       terminal                 thunar-volman            tomboy-panel             tunelp
tca_correct              test                     thunderbird              top                      tvtime
tcamgr                   test_chmLib              tic                      torrentinfo-console      tvtime-command
tcatest                  testdisk                 tickadj                  totem                    tvtime-configure
tcbmgr                   testlibraw               tie                      totem-audio-preview      tvtime-scanner
tcbmttest                test-moniker             tiff2bw                  totem-video-indexer      twinkle
tcbtest                  testparm                 tiff2pdf                 totem-video-thumbnailer  twistd
tcfmgr                   test_physfs              tiff2ps                  touch                    type
tcfmttest                test_ppa                 tiff2rgba                tput                     typelib-dump
tcftest                  testrb                   tiffcmp                  tr                       typeset
tchmgr                   testsaslauthd            tiffcp                   tracepath                tzap
tchmttest                test-speech              tiffcrop                 tracepath6               tzselect
tchtest                  tex                      tiffdiff                 traceroute               
tclsh                    texconfig                tiffdither               traceroute6              
tclsh8.5                 texconfig-dialog         tiffdump                 transformdb              
tcov                     texconfig-sys            tifficc                  translate                
2. история команд ... это тоже все знают ;-) :

Код: Выделить всё

[olej@notebook ~]$ history | tail -n10
  992  ls -l
  993  mv virtcd/ virtsd/
  994  sudo mv virtcd/ virtsd/
  995  ls -l
  996  mc
  997  t
  998  history 
  999  history 997
 1000  history --help
 1001  history | tail -n10
Но здесь есть одна сильно интересная возможность: реверсивный поиск команд в истории bash - <Ctrl>+r : набираю последовательно <Ctrl>+r , v , p - и получаю полное написание команды подключения к одной из своих VPN-сетей:

Код: Выделить всё

(reverse-i-search)`vp': ssh olej@vpn
- которую (команду) последний раз набирал месяца 2 назад и, конечно, не помню...
Обратите внимание, что символы, вводимые после <Ctrl>+r ищутся контекстным поиском в любом месте команды (не обязательно в начале! - см. как оно мне 'vpn' нашло ;-) ).
Последующее <Enter> после <Ctrl>+r , v , p - и найденная команда начинает выполняться.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 18 ноя 2011, 16:49

Olej писал(а): Поэтому я помещаю здесь URL лучшего руководства по языку программирования bash:
http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Искусство программирования на языке сценариев командной оболочки
Автор: Mendel Cooper
Перевод: Андрей Киселев


Есть много руководств по shell, но это (поверьте - по опыту) - лучшее, потому как:
Эта же книга, которую я продолжаю считать лучшей по языку bash, размещена и здесь, на сайте: http://rus-linux.net/MyLDP/BOOKS/abs-gu ... -book.html ... чтоб далеко не ходить ;-)
Кроме всего прочего, размещение здесь хорошо форматировано, и удобно для чтения.

sikmir
Активист
Сообщения: 11
Зарегистрирован: 02 июл 2013, 15:07
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение sikmir » 02 июл 2013, 17:03

+1, действительно самая толковая книжка по bash, сам постоянно использую как справочник. Про перевод ничего не скажу, ибо предпочитаю читать в оригинале.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 06 фев 2014, 01:30

Olej писал(а):Это должен уметь каждый ... линуксоид :!: ;-)
Я здесь по случаю (совершенно другому) поместил пример на bash вычислительного приложения, совершенно не имеющего никакого отношения к самой операционной системе, и к её скриптам управления: сравнение языков программирования.

Кстати, вспомнилось, что существует (GNU?) несколько больших (до 1000 строк) публичных проектов, написанных полностью на bash: в некоторых кругах это считается высшим пилотажем. ;-)

Аватара пользователя
Lepton
Писатель
Сообщения: 73
Зарегистрирован: 18 окт 2011, 20:26
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Lepton » 11 фев 2014, 16:12

Скрипт шпаргалка - работа с цветом.
На rosettacode.org лежит скрипт (http://rosettacode.org/wiki/Terminal_co ... UNIX_Shell), который выводит лишь четыре примера:
rosettacode.sh

Код: Выделить всё

#!/bin/bash
# Check if the terminal supports colour
 
# We should know from the TERM evironment variable whether the system
# is comfigured for a colour terminal or not, but we can also check the
# tput utility to check the terminal capability records.
 
COLORS=8    # Assume initially that the system supports eight colours
case $TERM in
  linux)
    ;;      # We know this is a colour terminal
  rxvt)
    ;;      # We know this is a colour terminal
  *)   
    COLORS=`tput colors 2> /dev/null`    # Get the number of colours from the termcap file
esac
if [ -z $COLORS ] ; then
  COLORS=1    # Watch out for an empty returned value
fi
 
if [ $COLORS -le 2 ] ; then
  # The terminal is not colour
  echo "HW65000 This application requires a colour terminal" >&2
  exit 252    #ERLHW incompatible hardware
fi
 
# We know at this point that the terminal is colour
 
# Coloured text
tput setaf 1    #red
echo "Red"
tput setaf 4    #blue
echo "Blue"
tput setaf 3    # yellow
echo "Yellow"
 
# Blinking
tput setab 1    # red background
tput setaf 3    # yellow foreground
#tput blink     # enable blinking (but does not work on some terminals)
echo "Flashing text"
 
tput sgr0    # reset everything before exiting
Вывод
Изображение

Мне пример на Purebasic, там же, больше понравился. Переделал под shell :-D :
Coloured_text.sh

Код: Выделить всё

#!/bin/bash
echo "Background color (tput setab N) N: 0 1 2 3 4 5 6 7 "
   for Foreground in 0 1 2 3 4 5 6 7
   do
   echo -n "Foreground Color (tput setaf $Foreground) | "
   tput setaf $Foreground
	for Background in 0 1 2 3 4 5 6 7
	do
	echo -n "$(tput setab $Background)$Foreground$Background$(tput setab 9)"
	done
   echo ""
   tput setaf 9
   done
Вывод:
Изображение

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 08 май 2015, 11:17

Olej писал(а): несколько не очевидных приёмов работы с bash с консоли, ввод комбинаций, которые сильно ускоряют работу с командной строкой:

1. "дополнение командной строки" <Tab> ... ну, это все знают ;-)
Но вот то, что 2-х кратным <Tab><Tab> в начале командной строки выведет список всех команд
Команд (утилит) в составе современных дистрибутивов становится уже совсем много, и их не всегда удаётся упомнить.
А вот двойной <Tab> очень помогает в этом качестве. Типа вот такого:

Код: Выделить всё

olej@nvidia ~ $ a
Display all 110 possibilities? (y or n)
a2disconf                     apachectl                     arpd
a2dismod                      apg                           arping
a2dissite                     apgbfm                        as
a2enconf                      aplay                         asan_symbolize-3.5
a2enmod                       aplaymidi                     ascii-xfr
a2ensite                      apm_available                 aseqdump
a2p                           appletviewer                  aseqnet
a2query                       appres                        aspell
accept                        apropos                       aspell-autobuildhash
accessdb                      apt                           aspell-import
aclocal                       apt-add-repository            assistant
aclocal-1.14                  apt-cache                     atobm
aconnect                      apt-cdrom                     autoconf
acpi_available                apt-clone                     autogen
acpid                         apt-config                    autoheader
acpi_listen                   aptd                          autom4te
add-apt-key                   aptdcon                       automake
add-apt-repository            apt-extracttemplates          automake-1.14
addgroup                      apt-file                      autoopts-config
addpart                       apt-ftparchive                autoreconf
addr2line                     apt-get                       autoscan
add-remove-locales            aptitude                      autoupdate
add-shell                     aptitude-create-state-bundle  avahi-autoipd
adduser                       aptitude-curses               avahi-browse
agetty                        aptitude-run-state-bundle     avahi-browse-domains
alias                         apt-key                       avahi-daemon
alsa                          apt-mark                      avahi-publish
alsactl                       apt-sortpkgs                  avahi-publish-address
alsaloop                      apturl                        avahi-publish-service
alsamixer                     apturl-gtk                    avahi-resolve
alsaucm                       ar                            avahi-resolve-address
amidi                         arch                          avahi-resolve-host-name
amixer                        archdetect                    avahi-set-host-name
amuFormat.sh                  arecord                       avivotool
anacron                       arecordmidi                   awk
apache2                       arm2hpdl                      axi-cache
apache2ctl                    arp                           
Вряд ли кто без напоминания упомнит такую команду (очень важную!) как taskset :-o
Но её написание просто элементарно восстановить с двойным <Tab>:

Код: Выделить всё

olej@nvidia ~ $ t
t1ascii                   tcltk-depends             thunderbird               transmission-gtk
t1asm                     tcpd                      tic                       transset
t1binary                  tcpdchk                   time                      trap
t1disasm                  tcpdmatch                 timedatectl               tree
t1mac                     tcpdump                   timeout                   trial
t1unmac                   tdbbackup                 times                     troff
tabs                      tdbbackup.tdbtools        tload                     true
tac                       tdbdump                   tnameserv                 truncate
tail                      tdbrestore                toc2cddb                  trust
tailf                     tdbtool                   toc2cue                   try-from
tap2deb                   tee                       toe                       tset
tap2rpm                   telinit                   tomboy                    tsort
tapconvert                telnet                    top                       tst_inactivity_timer
tar                       telnet.netkit             toshsat1800-irdasetup     ttfread
tarcat                    tempfile                  toshset                   tty
taskset                   tesseract                 touch                     tune2fs
tbl                       test                      tput                      tunelp
tbl-dctrl                 testparm                  tr                        twistd
tc                        testrb                    tracepath                 type
tcc                       testrb1.9.1               tracepath6                typeset
tclsh                     tgz                       traceroute                tzconfig
tclsh8.5                  then                      traceroute6               tzselect
tclsh8.6                  thin-client-config-agent  traceroute6.iputils       

Код: Выделить всё

olej@nvidia ~ $ ta
tabs        tail        tap2deb     tapconvert  tarcat      
tac         tailf       tap2rpm     tar         taskset     
Или вот такой поиск по 3-м первым буквам:

Код: Выделить всё

olej@nvidia ~ $ tap
tap2deb     tap2rpm     tapconvert  

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Olej » 24 май 2016, 16:42

sikmir писал(а):+1, действительно самая толковая книжка по bash, сам постоянно использую как справочник. Про перевод ничего не скажу, ибо предпочитаю читать в оригинале.
Сделали и выложили (май 2016г.) новый перевод последней (как утверждается) редакции документа Advanced Bash-Scripting Guide: Полный ABS Guide.pdf (поскольку это частный ресурс, кому нужно - скачайте сразу, обсуждение со ссылками найдёте здесь: http://www.linuxim.ru/viewtopic.php?f=83&t=810 , если ссылка для скачивания потеряется):
Mendel Cooper
Revision 10
10 Марта 2014
'PUBLICDOMAIN' release

Аватара пользователя
Lepton
Писатель
Сообщения: 73
Зарегистрирован: 18 окт 2011, 20:26
Контактная информация:

Re: Программирование сценариев bash

Непрочитанное сообщение Lepton » 24 май 2016, 20:19

Olej писал(а): Сделали и выложили (май 2016г.) новый перевод последней
Вот это здорово!!! Спасибо за наводку :-)


Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей