Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
bash:developing [2015/12/24 11:46] – [D] mirocowbash:developing [2023/06/24 12:36] (текущий) – [R] mirocow
Строка 1: Строка 1:
 +{{tag>bash developing develop}}
 +
 ====== Bash ====== ====== Bash ======
  
 +===== Файлы конфигурации: .profile .bash_profile и .bashrc итд =====
 +
 +==== В чем отличие .bash_profile и .bashrc? ====
 +
 +.bash_profile загружается только при входе пользователя в систему (консольный вход, ssh), 
 +в то время как  .bashrc запускается для интерактивных сервисов выполняемых без
 +логина (запуск xterm).
 ===== Переменные и параметры ===== ===== Переменные и параметры =====
  
Строка 13: Строка 22:
 |$- |список флагов, переданных сценарию| |$- |список флагов, переданных сценарию|
 |$_ |содержит последний аргумент предыдущей команды| |$_ |содержит последний аргумент предыдущей команды|
 +
 ===== Потоки вывода и файловые дескрипторы ===== ===== Потоки вывода и файловые дескрипторы =====
  
   * du -h 1 > ./log 2>&1   * du -h 1 > ./log 2>&1
-    * Поток вывода + 
-    Поток ошибок +|Наименование|Описание| 
-    &обозначает файловый дескриптор 1+|1Поток вывода| 
 +|2Поток ошибок| 
 +|&1|обозначает файловый дескриптор 1|
  
  
Строка 32: Строка 44:
 files=( "/etc/passwd" "/etc/group" "/etc/hosts" ) files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
 limits=( 10, 20, 26, 39, 48) limits=( 10, 20, 26, 39, 48)
 +</code>
 +
 +==== ARGV ====
 +
 +<code bash>
 +# ------------- SCRIPT ------------- #
 +
 +#!/bin/bash
 +
 +echo
 +echo "# arguments called with ---->  ${@}     "
 +echo "# \$1 ---------------------->  $1       "
 +echo "# \$2 ---------------------->  $2       "
 +echo "# path to me --------------->  ${0}     "
 +echo "# parent path -------------->  ${0%/*}  "
 +echo "# my name ------------------>  ${0##*/} "
 +echo
 +exit
 +
 +# ------------- CALLED ------------- #
 +
 +# Notice on the next line, the first argument is called within double, 
 +# and single quotes, since it contains two words
 +
 +$  /misc/shell_scripts/check_root/show_parms.sh "'hello there'" "'william'"
 +
 +# ------------- RESULTS ------------- #
 +
 +# arguments called with --->  'hello there' 'william'
 +# $1 ---------------------->  'hello there'
 +# $2 ---------------------->  'william'
 +# path to me -------------->  /misc/shell_scripts/check_root/show_parms.sh
 +# parent path ------------->  /misc/shell_scripts/check_root
 +# my name ----------------->  show_parms.sh
 +
 +# ------------- END ------------- #
 </code> </code>
 ===== B ===== ===== B =====
Строка 37: Строка 85:
  
 ==== case ==== ==== case ====
 +
 <code> <code>
 case "$1" in case "$1" in
 start) start)
 esac esac
 +</code>
 +
 +==== cut ====
 +
 +микропрограмма для работы с текстом
 +
 +Параметры:
 +  * -d
 +  * -f(число)
 +
 +Переименовывает все файлы вида thread_1_seq_35970.1752.876204343 в файлы вида arch_1_0000035970_869578613.arc
 +<code bash>
 +#! /bin/bash
 +FOUND=0
 +for filename in *
 +do
 +  echo "$filename" | grep -q "thread_1_seq_"
 +
 +  if [ $? -eq $FOUND ]; then
 +    part=`echo $filename | cut -d "_" -f4 | cut -d "." -f1`
 +    mv "$filename" "arch_1_00000${part}_869578613.arc"
 +  fi
 +
 +done
 </code> </code>
 ===== D =====  ===== D ===== 
Строка 50: Строка 123:
 <code># bash -x script.sh</code> <code># bash -x script.sh</code>
  
 +==== dialog ====
 +
 +Представляет из себя интерфейс для библиотеки ncurses. И позволяет строить диалоги из скрипта. Альтернативой dialog может служить whiptail, который даже присутствует в некоторых системах по умолчанию.
 +
 +[[system:dialog|]]
 +
 +<code bash>
 +#!/usr/bin/bash
 +
 +Choice=`$Dialog --stdout --clear --menu "Выберите файл" 20 71 14 $Spisok`
 +retval=$?
 +
 +case $retval in
 +    0)
 +esac
 +</code>
 ===== E ===== ===== E =====
 ===== F ===== ===== F =====
Строка 96: Строка 185:
 ===== G ===== ===== G =====
 ===== H ===== ===== H =====
 +
 +<code bash>
 +
 +Choice="Y"
 +
 +cat << EOF_CONFIG > $config
 +client
 +remote xxxxx
 +port 1194
 +proto udp
 +dev tun
 +ns-cert-type server
 +tls-client
 +reneg-sec 60
 +mtu-test
 +cipher AES-256-CBC
 +comp-lzo
 +persist-key
 +persist-tun
 +keysize 256
 +nobind
 +explicit-exit-notify 2
 +pkcs12 yyy/$Choice
 +EOF_CONFIG
 +
 +echo $config
 +</code>
 ===== I ===== ===== I =====
  
Строка 126: Строка 242:
 fi fi
 </code> </code>
 +
 +=== input ===
 +
 +Запрос символа от пользователя
 +
 +<code bash>
 +echo -n "Продолжить? (y/n) "
 +
 +read item
 +case "$item" in
 +    y|Y) echo "Ввели «y», продолжаем..."
 +        ;;
 +    n|N) echo "Ввели «n», завершаем..."
 +        exit 0
 +        ;;
 +    *) echo "Ничего не ввели. Выполняем действие по умолчанию..."
 +        ;;
 +esac
 +</code>
 +
 ===== J ===== ===== J =====
 ===== K ===== ===== K =====
Строка 132: Строка 268:
 ===== N ===== ===== N =====
 ===== O ===== ===== O =====
 +
 +==== echo ====
 +
 +Вывод прогресс бара
 +<code bash>
 +$ echo -ne '#####                     (33%)\r'
 +</code>
 +
 ===== P ===== ===== P =====
 ===== Q ===== ===== Q =====
 ===== R ===== ===== R =====
 +
 +<code bash>
 +$ IFS=' ' read -r -a DATABASES_SELECTED <<< "$DATABASES_SELECTED"
 +$ read str <<< x  "; echo "-$str-"
 +-x-
 +$ IFS="" read str <<< x  "; echo "-$str-"
 +-  x  -
 +$ IFS= read str <<< x  "; echo "-$str-"
 +-  x  -
 +$ _
 +</code>
 +
 +  * IFS=";" выставляем делимитер разбивки (в нашем случае ";")
 +  * set -- $line - разбиваем строку, после чего каждая ее часть будет доступна как $1, $2, ...
 ===== S ===== ===== S =====
 +
 +
 +==== select ====
 +
 +<code bash>
 +select action in "Опция 1" "Опция 2" "Выход" 
 +do 
 +echo $action 
 +test $action = "Выход" && break 
 +done 
 +</code>
 ===== T ===== ===== T =====
  
 ====== test ====== ====== test ======
  
-    * Параметры:  +  * Параметры: 
-      * -Наличие файла +      * ''-b file'' — истина, если file существует и является специальным блочным устройством. 
-      * -Наличие директории +      * ''-c file'' — истина, если file существует и символьное устройство. 
-      * --  +      * ''-d file'' — истина, если file существует и является каталогом. 
-      * -z - Наличие данных в строке +      * ''-e file'' — истина, если file существует. 
-    * Сокращенный вариант [] +      * ''-f file'' — истина, если file существует и является обычным файлом. 
-    * http://www.ibm.com/developerworks/ru/library/l-bash-test/+      * ''-g file'' — истина, если file существует и имеет установленным групповой идентификатор (set-group-id). 
 +      * ''-k file'' — истина, если file имеет установленным «sticky» бит. 
 +      * ''-L file'' — истина, если file существует и является символьной ссылкой. 
 +      * ''-p file'' — истина, если file существует и является именованным каналом (pipe). 
 +      * ''-r file'' — истина, если file существует и читаем. 
 +      * ''-s file'' — истина, если file существует и имеет размер больше, чем ноль. 
 +      * ''-S file'' — истина, если file существует и является сокетом. 
 +      * ''-t [fd]'' — истина, если fd открыт на терминале. Если fd пропущен, по умолчанию 1 (стандартное устройство вывода). 
 +      * ''-u file'' — истина, если file существует и имеет установленным бит пользователя (set-user-id). 
 +      * ''-w file'' — истина, если file существует и записываем. 
 +      * ''-x file'' — истина, если file существует и исполняем. 
 +      * ''-O file'' — истина, если file существует и его владелец имеет эффективный идентификатор пользователя. 
 +      * ''-G file'' — истина, если file существует и его владелец имеет эффективный идентификатор группы. 
 +      * ''file1 -nt file2'' — истина, если file1 новее (дата модификации), чем file2. 
 +      * ''file1 -ot file2'' — истина, если file1 старее, чем file2. 
 +      * ''file1 -ef file2'' — истина, если file1 и file2 имеют то же устройство и номер inode. 
 +      * ''-z string'' — истина, если длина string равна нулю. 
 +      * ''-n string'' — истина, если длина string не ноль. 
 +      * ''string1 = string2'' — истина, если строки равны
 +      * ''string1 != string2'' — истина, если строки не равны. 
 +      * ''! expr'' — истина, если выражение expr ложь. 
 +      * ''expr1 -a expr2'' — истина, если оба выражения expr1 и expr2 истина. 
 +      * ''expr1 -o expr2'' — истина, если хотя бы одно из выражений expr1 или expr2 истина. 
 +      * ''arg1 %оператор% arg2 -eq, -ne, -lt, -le, -gt, или -ge'' — эти арифметические бинарные операции возвращают истину, если arg1 равно (-eq), не равно (-ne), меньше чем (-lt), меньше чем или равно (-le), больше чем (-gt), или больше или равно (-ge), чем arg2, соответственно. arg1 и arg2 могут быть положительными целыми, отрицательными целыми, или специальными выражениями -l string, которые вычисляют длину string. 
 +  * Сокращенный вариант **[ ]** 
 + 
 + 
 +===== Применение в коде ===== 
 + 
 +<code bash> 
 +if [ $daynow != 1 ]; then 
 +# .... 
 +fi 
 + 
 +if [ $daynow -ge 1 ] && [ $daynow -le 7 ]; then 
 +# .... 
 +fi 
 +</code> 
 + 
 +Сравнение **-eq** с **==** 
 + 
 +<code bash> 
 +$ [ a == a ]; echo $? 
 +
 + 
 +$ [ a -eq a ]; echo $? 
 +-bash: [: a: integer expression expected 
 +
 +</code> 
 + 
 +=== status === 
 + 
 +Проверка статуса выполнения программы 
 + 
 +<code bash> 
 +rm test_file 
 + 
 +if [ $? -eq 0 ]; then 
 +    echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" 
 +    echo 
 +else 
 +    echo -n "$(tput hpa $(tput cols))$(tput cub 6)[fail]" 
 +    echo 
 +fi 
 +</code> 
 + 
 +====== tput ====== 
 + 
 +Команда tput инициализирует и управляет вашими сеансами работы с терминалом, используя базу данных terminfo. С помощью tput вы можете управлять различными функциями терминала, такими как перемещение или изменение вида курсора, изменение свойств текста и очистка определенных областей экрана терминала. 
 + 
 +  tput hpa N — сдвиг курсора на N позиций 
 +  * tput cols получает ширину окна терминала 
 +  * tput cub 6 — сдвигает курсор на 6 позиций влево 
 + 
 +Также можно выставить цвет 
 + 
 +  * tput setaf 0..7 — цвет текста 
 +  * tput setab 0..7 — цвет фона 
 +  * tput sgr0 — сброс на дефолтный 
 + 
 +Подробнее: http://www.ibm.com/developerworks/ru/library/au-learningtput/
 ===== U ===== ===== U =====
 ===== V ===== ===== V =====
Строка 153: Строка 402:
 ===== Y ===== ===== Y =====
  
-====== Ссылки ====== 
- 
-  * [[http://binsh.ru/2008/12/13/bash-pitfalls-part01.html|Частые ошибки программирования на Bash (часть 1)]] 
-  * [[http://binsh.ru/2008/12/18/bash-pitfalls-part02.html|Частые ошибки программирования на Bash (часть 2)]] 
-  * [[http://binsh.ru/2008/12/22/bash-pitfalls-part03.html|Частые ошибки программирования на Bash (часть 3)]] 
-  * [[http://binsh.ru/2008/12/24/bash-pitfalls-part04.html|Частые ошибки программирования на Bash (часть 4)]]    
-  * [[http://binsh.ru/2008/12/29/bash-pitfalls-part05.html|Частые ошибки программирования на Bash (часть 5)]] 
-  * [[system:shell:bash:Перенаправление вывода|Перенаправление вывода]] 
-  * [[bash:основы_bash._часть_1|Основы BASH. Часть 1]] 
-  * [[bash:основы_bash._часть_2|Основы BASH. Часть 2.]]   
-  * http://bappoy.pp.ru/2008/12/22/bash-pitfalls-part03.html  
-  * [[http://www.opennet.ru/docs/RUS/bash_scripting_guide/|Advanced Bash-Scripting Guide]] 
-  * http://habrahabr.ru/post/151771/ 
-  * [[http://linux.yaroslavl.ru/docs/conf/gnu-util/bash/bash.html|Особенности работы оболочки bash]] 
-  * [[http://www.opennet.ru/docs/RUS/bash_scripting_guide/|Искусство программирования на языке сценариев командной оболочки]] 
-  * http://eddnet.org/?tag=bash 
- 
-====== Видео уроки ====== 
  
-  * https://www.youtube.com/playlist?list=PLLyG9JTjVd9VTEKisukGLJhl8H2YeIN09