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

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


cookbookbash

Shell Something Out

Цветной вывод echo

#!/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"

Экспорт переменной и изменение текущей

export PATH="$PATH:/home/user/bin"

Получить длину строки

$ var=12345678901234567890$
echo ${#var}
20

root or no root

#!/bin/bash

if [ "$UID" -ne "0" ]; then
    echo "You no ROOR, go on!!!"
else
    echo "Welcome ROOT!!!"
fi

Математика

Используем let, [], expr

#!/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

bc: калькулятор

echo "5*7.5" | bc
37.5

no=54;
result=`echo "$no * 1.5" | bc`
echo $result
81.0

bc: Количество цифр после запятой

echo "scale=4;2/3" | bc
.6666

bc: Перевод в другие системы исчисления

no=100
echo "obase=2;$no" | bc
1100100
no=1100100
echo "obase=10;ibase=2;$no" | bc
100

bc: Степени и корни

echo "sqrt(100)" | bc #Square root
echo "10^10" | bc #Square

Играемся с дескрипторами и перенаправлениями

Файловые дескрипторы stdin, stdout, и stderr.

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

Массивы и ассоциативные массивы

#!/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}
#ассоциативные массивы

#указываем, что 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[*]}

Пользовательские псевдонимы(алиасы)

Создаем алиас(удаляется после прекращения сеанса)

alias upd="apt-get update ; apt-get upgrade"

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

echo "alias upd='apt-get update ; apt-get upgrade'" >> ~/.bashrc

возможно, что необходим именно запуск команды, а не алиаса, тогда ставим косую черту перед командой «\ls»

Собираем информацию о терминале

tput cols # количество колонок в окне терминала
tput lines # количество строк в окне терминала
tput cup 100 100 # переместить курсор на позицию 100 100

строим ветвь парабалы

#!/bin/bash

for i in `seq 12`
do
    kv=`echo $i^2 | bc`
    tput cup $i $kv
    echo $i";"$kv
done

пишем букву V

#!/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

Читаем пароль, при этом не показываем его

#!/bin/bash
#Filename: password.sh
echo -e "Enter password: "
stty -echo
read password
stty echo
echo
echo Password read.

Получаем дату

1970-01-01 00:00:00 UTC дата начала эпохи date
date +%d.%m.%Y #вывод даты в нужном формате

Доступное форматирование:

%alocale's abbreviated weekday name (e.g., Sun)
%Alocale's full weekday name (e.g., Sunday)
%blocale's abbreviated month name (e.g., Jan)
%Blocale's full month name (e.g., January)
%clocale's date and time (e.g., Thu Mar3 23:05:25 2005)
%Ccentury; like %Y, except omit last two digits (e.g., 20)
%dday of month (e.g., 01)
%Ddate; same as %m/%d/%y
%eday of month, space padded; same as %_d
%Ffull date; same as %Y-%m-%d
%glast two digits of year of ISO week number (see %G)
%Gyear of ISO week number (see %V); normally useful only with %V
%hsame as %b
%Hhour (00..23)
%Ihour (01..12)
%jday of year (001..366)
%khour, space padded ( 0..23); same as %_H
%lhour, space padded ( 1..12); same as %_I
%mmonth (01..12)
%Mminute (00..59)
%na newline
%Nnanoseconds (000000000..999999999)
%plocale's equivalent of either AM or PM; blank if not known
%Plike %p, but lower case
%rlocale's 12-hour clock time (e.g., 11:11:04 PM)
%R24-hour hour and minute; same as %H:%M
%sseconds since 1970-01-01 00:00:00 UTC
%Ssecond (00..60)
%ta tab
%Ttime; same as %H:%M:%S
%uday of week (1..7); 1 is Monday
%Uweek number of year, with Sunday as first day of week (00..53)
%VISO week number, with Monday as first day of week (01..53)
%wday of week (0..6); 0 is Sunday
%Wweek number of year, with Monday as first day of week (00..53)
%xlocale's date representation (e.g., 12/31/99)
%Xlocale's time representation (e.g., 23:13:48)
%ylast two digits of year (00..99)
%Yyear
%z+hhmm numeric time zone (e.g., -0400)
%:z+hh:mmnumeric time zone (e.g., -04:00)
%::z +hh:mm:ssnumeric time zone (e.g., -04:00:00)
%:::znumeric time zone with : to necessary precision (e.g., -04, +05:30)
%Zalphabetic time zone abbreviation (e.g., EDT)

Вычисляем сколько прошло времени с начала года

date --date "Feb 17" +%j
048

Вычисляем сколько времени заняла работа скрипта.

#!/bin/bash
start=$(date +%s)
sleep 5
end=`date +%s`
itog=$((end - start))
echo "Операция заняла "$itog" сек."

sleep производит задержку на указанное количество секунд (10 20 0.25 …)

Деббаг скрипртов bash

bash -x time
++ date +%s
+ start=1443095373
+ sleep 5
++ date +%s
+ end=1443095378
+ let itog=1443095378-1443095373
+ echo 'Операция заняла 5 сек.'
Операция заняла 5 сек.

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

Аргументы и функции

Объявление функции. Функция должна быть объявлена раньше, чем её можно будет использовать.

function fname()
{
statements;
}
Or alternately,
fname()
{
statements;
}

Функция вызывается по имени, так же ей могут передаваться аргументы.

fname

fname arg1 arg2
#!/bin/bash

fname() #объявляется функция
{
let summa=$1+$2
let pro=$1*$2
echo $summa
return $pro # Return value
}

fname 23 17 #вызывается функция с параметрами
echo $? # $? принимает значение возврата функции

Рекурсивные функции(функции, которые вызывают сами себя).

F()
{ echo $1; F hello; sleep 1; }

Запись выходной последовательности команд в переменную

Вывод команды cmd1 передается на вход cmd2 и т.д.

cmd1 | cmd2 | cmd3

Запись вывода команды в переменную

cmd_output=$(COMMANDS)
cmd_output=`COMMANDS`

cmd_output=$(ls | cat -n)
echo $cmd_output

cmd_output=`ls | cat -n`
echo $cmd_output

Субшел
Субшел запускается внутри шела с использованием скобок ().
Изменения субшелла не затрагивают шелл

pwd;
(cd /bin; ls);
pwd;

Читаем n символов без нажатия клавиши Enter

Читаем n символов в переменную

read -n number_of_chars variable_name
read -n 2 var
echo $var

Читаем переменную не отображая ввод символов

read -s var
echo "you passwd:"
read -s pass
echo $pass

Отображаем надпись перед чтением переменной

read -p "Enter input:" var
read -p "you passwd: " -s pass

Читаем переменную после определенного интервала времени

read -t timeout var
read -p "you passwd: " -t 3 -s pass

Задаем символ завершения ввода

read -d delim_char var
read -d "!" var
echo $var

Разделители полей и итераторы

internal field separator (IFS) - внутренний разделитель полей. Переменная указывающая что является разделителем(по умолчанию пробел)

#!/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

Генерация последовательностей

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
root@uba:~/script# for i in {a..z}
> do
> echo $i
> done

Контроль и тестирование

[ 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

Проверяем файлы по различным флагам

[ -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

Вывод на печать всех файлов в текущей директории являющихся исполняемыми

for i in * ; do [ -x $i ] && echo $i; done

Контроль строк

‰‰ [[ $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
str1="Not empty "
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
echo str1 is nonempty and str2 is empty string.
fi
cookbookbash.txt · Последние изменения: 2015/09/29 08:28 — sander