Инструменты пользователя

Инструменты сайта


cookbookbash

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
cookbookbash [2015/09/29 08:26]
sander [Контроль и тестирование]
cookbookbash [2015/09/29 08:28] (текущий)
sander [Контроль и тестирование]
Строка 1: Строка 1:
 +====== Shell Something Out ======
  
 +===== Цветной вывод echo =====
 + 
 +<​code>​
 +#!/bin/bash
 +
 +#reset = 0, black = 30, red = 31,green = 32, yellow = 33, 
 +      blue = 34, magenta = 35, cyan = 36, and white = 37
 +#reset = 0, black = 40, red = 41, green = 42, yellow = 43,
 +      blue = 44,magenta = 45, cyan = 46, and white=47
 +
 +echo -e "​\e[1;​31m This is red text \e[0m"
 +echo -e "​\e[1;​42m Green Background \e[0m"
 +echo -e "​\e[33;​44m Blue Background and yellow text \e[0m"
 +</​code>​
 +
 +===== Экспорт переменной и изменение текущей =====
 +
 +<​code>​
 +export PATH="​$PATH:/​home/​user/​bin"​
 +</​code>​
 +
 +===== Получить длину строки =====
 +<​code>​
 +$ var=12345678901234567890$
 +echo ${#var}
 +20
 +</​code>​
 +
 +=====root or no root=====
 +<​code>​
 +#!/bin/bash
 +
 +if [ "​$UID"​ -ne "​0"​ ]; then
 +    echo "You no ROOR, go on!!!"
 +else
 +    echo "​Welcome ROOT!!!"​
 +fi
 +</​code>​
 +
 +===== Математика =====
 +==== Используем let, [], expr ====
 +
 +<​code>​
 +#!/bin/bash
 +
 +n1=4;
 +n2=5;
 +
 +let result=n1+n2
 +echo $result
 +let n1++ #​увеличиваем на 1
 +let n2-- #​уменьшаем на 1
 +
 +let n1+=6 #​прибавляем 6
 +let n2-=6 #​вычитаем 6
 +
 +result=$[ n1 + n2 ] # складываем
 +echo $result
 +
 +result=$[ $n1 + 5 ] # складываем
 +echo $result
 +
 +result=$(( n1 + 5 )) # складываем
 +echo $result
 +
 +result=`expr 3 + 4` # складываем
 +echo $result
 +
 +result=$(expr $n1 + 5) # складываем
 +echo $result
 +</​code>​
 +
 +==== bc: калькулятор ====
 +
 +<​code>​
 +echo "​5*7.5"​ | bc
 +37.5
 +
 +no=54;
 +result=`echo "$no * 1.5" | bc`
 +echo $result
 +81.0
 +</​code>​
 +
 +==== bc: Количество цифр после запятой ====
 +<​code>​
 +echo "​scale=4;​2/​3"​ | bc
 +.6666
 +</​code>​
 +==== bc: Перевод в другие системы исчисления ====
 +<​code>​
 +no=100
 +echo "​obase=2;​$no"​ | bc
 +1100100
 +no=1100100
 +echo "​obase=10;​ibase=2;​$no"​ | bc
 +100
 +</​code>​
 +==== bc: Степени и корни ====
 +<​code>​
 +echo "​sqrt(100)"​ | bc #Square root
 +echo "​10^10"​ | bc #Square
 +</​code>​
 +===== Играемся с дескрипторами и перенаправлениями =====
 +Файловые дескрипторы stdin, stdout, и stderr.\\
 +<​code>​
 +echo "This is a sample text 1" > temp.txt
 +echo "This is sample text 2" >> temp.txt
 +ls + 2> out.txt
 +cmd &> output.txt или cmd 2>&1 output.txt
 +command | tee FILE1 FILE2
 +</​code>​
 +===== Массивы и ассоциативные массивы =====
 +<​code>​
 +#!/bin/bash
 +#​объявление массива
 +array_var=(1 2 3 4 5 6)
 +
 +#​выводим элемент массива с индексом 2
 +echo ${array_var[2]}
 +
 +#​объявление массива(пара индекс-значение)
 +array_var[0]="​test1"​
 +array_var[1]="​test2"​
 +array_var[2]="​test3"​
 +array_var[3]="​test4"​
 +array_var[4]="​test5"​
 +array_var[5]="​test6"​
 +
 +#​выводим элемент массива с индексом 1
 +echo ${array_var[1]}
 +
 +#​выводим все элементы массива
 +echo ${array_var[*]}
 +echo ${array_var[@]}
 +
 +#​выводим количество элементов массива
 +echo ${#​array_var[*]}
 +
 +#​выводим количество индексов массива
 +echo ${#​array_var}
 +</​code>​
 +<​code>​
 +#​ассоциативные массивы
 +
 +#​указываем,​ что ass_array - ассоциативный массив
 +declare -A ass_array
 +
 +#​объявляем массив
 +ass_array=([index1]=val1 [index2]=val2)
 +
 +#​объявляем массив
 +ass_array[index3]=val3
 +ass_array[index4]=val4
 +
 +#​выводим элемент массива с указателем index2
 +echo ${ass_array[index2]}
 +#​выводим все элементы массива
 +echo ${ass_array[*]}
 +echo ${ass_array[@]}
 +#​выводим все индексы массива
 +echo ${!ass_array[*]}
 +echo ${ass_array[@]}
 +
 +#​выводим количество элементов в массиве
 +echo ${#​ass_array[*]}
 +
 +</​code>​
 +
 +===== Пользовательские псевдонимы(алиасы) =====
 +Создаем алиас(удаляется после прекращения сеанса)
 +<​code>​
 +alias upd="​apt-get update ; apt-get upgrade"​
 +</​code>​
 +Создаем алиас для пользователя который останется после перезапуска сеанса
 +<​code>​
 +echo "alias upd='​apt-get update ; apt-get upgrade'"​ >> ~/.bashrc
 +</​code>​
 +возможно,​ что необходим именно запуск команды,​ а не алиаса,​ тогда ставим косую черту перед командой
 + "​\ls"​
 +===== Собираем информацию о терминале =====
 +<​code>​
 +tput cols # количество колонок в окне терминала
 +tput lines # количество строк в окне терминала
 +</​code>​
 +<​code>​
 +tput cup 100 100 # переместить курсор на позицию 100 100
 +</​code>​
 +
 +**строим ветвь парабалы**
 +<​code>​
 +#!/bin/bash
 +
 +for i in `seq 12`
 +do
 +    kv=`echo $i^2 | bc`
 +    tput cup $i $kv
 +    echo $i";"​$kv
 +done
 +</​code>​
 +**пишем букву V**
 +<​code>​
 +#!/bin/bash
 +w=10
 +l=10
 +while [ $w -lt "​17"​ ]
 +do
 +    tput cup $l $w
 +    sleep 0.1
 +    echo "​VV"​
 +
 +    let w++
 +    if [ $l -gt "​15"​ ];then
 +        while [ $l -ne "​10"​ ]
 +        do
 +            let l--
 +            let w++
 +            tput cup $l $w
 +            sleep 0.1
 +            echo "​VV"​
 +        done
 +    else
 +        let l++
 +    fi
 +done
 +tput cup 20 0
 +</​code>​
 +
 +**Читаем пароль,​ при этом не показываем его**
 +<​code>​
 +#!/bin/bash
 +#Filename: password.sh
 +echo -e "Enter password: "
 +stty -echo
 +read password
 +stty echo
 +echo
 +echo Password read.
 +</​code>​
 +
 +===== Получаем дату =====
 +1970-01-01 00:00:00 UTC дата начала эпохи
 +date\\
 +date +%d.%m.%Y #вывод даты в нужном формате\\
 +\\
 +**Доступное форматирование:​**
 +|%a|locale'​s abbreviated weekday name (e.g., Sun)|
 +|%A|locale'​s full weekday name (e.g., Sunday)|
 +|%b|locale'​s abbreviated month name (e.g., Jan)|
 +|%B|locale'​s full month name (e.g., January)|
 +|%c|locale'​s date and time (e.g., Thu Mar3 23:05:25 2005)|
 +|%C|century;​ like %Y, except omit last two digits (e.g., 20)|
 +|%d|day of month (e.g., 01)|
 +|%D|date; same as %m/%d/%y|
 +|%e|day of month, space padded; same as %_d|
 +|%F|full date; same as %Y-%m-%d|
 +|%g|last two digits of year of ISO week number (see %G)|
 +|%G|year of ISO week number (see %V); normally useful only with %V|
 +|%h|same as %b|
 +|%H|hour (00..23)|
 +|%I|hour (01..12)|
 +|%j|day of year (001..366)|
 +|%k|hour, space padded ( 0..23); same as %_H|
 +|%l|hour, space padded ( 1..12); same as %_I|
 +|%m|month (01..12)|
 +|%M|minute (00..59)|
 +|%n|a newline|
 +|%N|nanoseconds (000000000..999999999)|
 +|%p|locale'​s equivalent of either AM or PM; blank if not known|
 +|%P|like %p, but lower case|
 +|%r|locale'​s 12-hour clock time (e.g., 11:11:04 PM)|
 +|%R|24-hour hour and minute; same as %H:%M|
 +|%s|seconds since 1970-01-01 00:00:00 UTC|
 +|%S|second (00..60)|
 +|%t|a tab|
 +|%T|time; same as %H:%M:%S|
 +|%u|day of week (1..7); 1 is Monday|
 +|%U|week number of year, with Sunday as first day of week (00..53)|
 +|%V|ISO week number, with Monday as first day of week (01..53)|
 +|%w|day of week (0..6); 0 is Sunday|
 +|%W|week number of year, with Monday as first day of week (00..53)|
 +|%x|locale'​s date representation (e.g., 12/31/99)|
 +|%X|locale'​s time representation (e.g., 23:13:48)|
 +|%y|last two digits of year (00..99)|
 +|%Y|year|
 +|%z|+hhmm numeric time zone (e.g., -0400)|
 +|%:​z+hh:​mm|numeric time zone (e.g., -04:00)|
 +|%::z +hh:​mm:​ss|numeric time zone (e.g., -04:00:00)|
 +|%:::​|znumeric time zone with : to necessary precision (e.g., -04, +05:30)|
 +|%Z|alphabetic time zone abbreviation (e.g., EDT)|
 +
 +**Вычисляем сколько прошло времени с начала года**
 +<​code>​
 +date --date "Feb 17" +%j
 +048
 +</​code>​
 +
 +**Вычисляем сколько времени заняла работа скрипта.**
 +<​code>​
 +#!/bin/bash
 +start=$(date +%s)
 +sleep 5
 +end=`date +%s`
 +itog=$((end - start))
 +echo "​Операция заняла "​$itog"​ сек."​
 +</​code>​
 +
 +**sleep** производит задержку на указанное количество секунд (10 20 0.25 ...)\\
 +
 +===== Деббаг скрипртов bash =====
 +<​code>​
 +bash -x time
 +++ date +%s
 ++ start=1443095373
 ++ sleep 5
 +++ date +%s
 ++ end=1443095378
 ++ let itog=1443095378-1443095373
 ++ echo '​Операция заняла 5 сек.'​
 +Операция заняла 5 сек.
 +</​code>​
 +
 +**set -x**: This displays arguments and commands upon their execution\\
 +**set +x**: This disables debugging\\
 +**set -v**: This displays input when they are read\\
 +**set +v**: This disables printing input\\
 +
 +===== Аргументы и функции =====
 +**Объявление функции.** Функция должна быть объявлена раньше,​ чем её можно будет использовать. ​
 +<​code>​
 +function fname()
 +{
 +statements;
 +}
 +Or alternately,​
 +fname()
 +{
 +statements;
 +}
 +</​code>​
 +
 +**Функция вызывается по имени, так же ей могут передаваться аргументы.**
 +<​code>​
 +fname
 +
 +fname arg1 arg2
 +</​code>​
 +<​code>​
 +#!/bin/bash
 +
 +fname() #​объявляется функция
 +{
 +let summa=$1+$2
 +let pro=$1*$2
 +echo $summa
 +return $pro # Return value
 +}
 +
 +fname 23 17 #​вызывается функция с параметрами
 +echo $? # $? принимает значение возврата функции
 +</​code>​
 +
 +**Рекурсивные функции(функции,​ которые вызывают сами себя).**
 +<​code>​
 +F()
 +{ echo $1; F hello; sleep 1; }
 +</​code>​
 +
 +===== Запись выходной последовательности команд в переменную =====
 +Вывод команды cmd1 передается на вход cmd2 и т.д.
 +<​code>​
 +cmd1 | cmd2 | cmd3
 +</​code>​
 +**Запись вывода команды в переменную**
 +<​code>​
 +cmd_output=$(COMMANDS)
 +cmd_output=`COMMANDS`
 +
 +cmd_output=$(ls | cat -n)
 +echo $cmd_output
 +
 +cmd_output=`ls | cat -n`
 +echo $cmd_output
 +</​code>​
 +**Субшел**\\
 +Субшел запускается внутри шела с использованием скобок ().\\
 +Изменения субшелла не затрагивают шелл
 +<​code>​
 +pwd;
 +(cd /bin; ls);
 +pwd;
 +</​code>​
 +
 +===== Читаем n символов без нажатия клавиши Enter =====
 +**Читаем n символов в переменную**
 +<​code>​
 +read -n number_of_chars variable_name
 +</​code>​
 +<​code>​
 +read -n 2 var
 +echo $var
 +</​code>​
 +**Читаем переменную не отображая ввод символов**
 +<​code>​
 +read -s var
 +</​code>​
 +<​code>​
 +echo "you passwd:"​
 +read -s pass
 +echo $pass
 +</​code>​
 +**Отображаем надпись перед чтением переменной**
 +<​code>​
 +read -p "Enter input:"​ var
 +</​code>​
 +
 +<​code>​
 +read -p "you passwd: " -s pass
 +</​code>​
 +
 +**Читаем переменную после определенного интервала времени**
 +<​code>​
 +read -t timeout var
 +</​code>​
 +
 +<​code>​
 +read -p "you passwd: " -t 3 -s pass
 +</​code>​
 +
 +**Задаем символ завершения ввода**
 +
 +<​code>​
 +read -d delim_char var
 +</​code>​
 +
 +<​code>​
 +read -d "​!"​ var
 +echo $var
 +</​code>​
 +
 +===== Разделители полей и итераторы =====
 +**internal field separator (IFS) - внутренний разделитель полей.** Переменная указывающая что является разделителем(по умолчанию пробел)
 +<​code>​
 +#!/bin/bash
 +data="​name,​sex,​rollno,​location"​
 +#To read each of the item in a variable, we can use IFS.
 +oldIFS=$IFS
 +IFS=","​
 +for item in $data;
 +do
 +echo Item: $item
 +done
 +IFS=$oldIFS
 +</​code>​
 +===== Генерация последовательностей =====
 +<​code>​
 +root@uba:​~/​script#​ echo {1..20}
 +1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 +root@uba:​~/​script#​ echo {A..Y}
 +A B C D E F G H I J K L M N O P Q R S T U V W X Y
 +</​code>​
 +
 +<​code>​
 +root@uba:​~/​script#​ for i in {a..z}
 +> do
 +> echo $i
 +> done
 +</​code>​
 +
 +===== Контроль и тестирование =====
 +<​code>​
 +[ condition ] && action; # action executes if the condition is true
 +
 +[ condition ] || action; # action executes if the condition is false
 +
 +[$var -eq 0 ] or [ $var -eq 0]
 +
 +Multiple test conditions can be combined as follows:
 +[ $var1 -ne 0 -a $var2 -gt 2 ] # using and -a
 +[ $var1 -ne 0 -o var2 -gt 2 ] # OR -o
 +
 +</​code>​
 +
 +**Проверяем файлы по различным флагам**
 +<​code>​
 +[ -f $file_var ] This returns true if the given variable holds a regular file path or filename ​
 +‰‰[ -x $var ] This returns true if the given variable holds a file path or filename that is executable
 +[ -d $var ] This returns true if the given variable holds a directory path or directory name|
 +‰‰[ -e $var ] This returns true if the given variable holds an existing file
 +‰‰[ -c $var ] This returns true if the given variable holds the path of a character device file
 +[ -b $var ] This returns true if the given variable holds the path of a block device file
 +‰‰[ -w $var ] This returns true if the given variable holds the path of a file that is writable
 +‰‰[ -r $var ] This returns true if the given variable holds the path of a file that is readable
 +‰‰[ -L $var ] This returns true if the given variable holds the path of a symlink
 +</​code>​
 +Вывод на печать всех файлов в текущей директории являющихся исполняемыми
 +<​code>​
 +for i in * ; do [ -x $i ] && echo $i; done
 +</​code>​
 +**Контроль строк**
 +<​code>​
 +‰‰ [[ $str1 = $str2 ]]: This returns true when str1 equals str2.
 +‰‰ [[ $str1 == $str2 ]]: It is an alternative method for string equality check.
 +‰‰ [[ $str1 != $str2 ]]: This returns true when str1 and str2 mismatch.
 +‰‰ [[ $str1 > $str2 ]]: This returns true when str1 is alphabetically greater than str2.
 +‰‰ [[ $str1 < $str2 ]]: This returns true when str1 is alphabetically lesser than str2.
 +‰‰ [[ -z $str1 ]]: This returns true if str1 holds an empty string
 +‰‰ [[ -n $str1 ]]: This returns true if str1 holds a nonempty string
 +</​code>​
 +
 +<​code>​
 +str1="​Not empty "
 +str2=""​
 +if [[ -n $str1 ]] && [[ -z $str2 ]];
 +then
 +echo str1 is nonempty and str2 is empty string.
 +fi
 +</​code>​
cookbookbash.txt · Последние изменения: 2015/09/29 08:28 — sander