BASH — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
 
(не показано 30 промежуточных версий этого же участника)
Строка 23: Строка 23:
 
  Privet vasya
 
  Privet vasya
 
  Privet petya
 
  Privet petya
 +
 +
 +
'''Цикл if'''
 +
#!/bin/bash
 +
 +
if [ "$1" == "Vasya" ]; then
 +
    echo "Privet $1"
 +
else [ "$1" == "Petya" ]; then
 +
    echo "Privet $1"
 +
else echo "Zdarova $1"
 +
fi
 +
 +
Результаты
 +
# ./script
 +
Zdarova
 +
 +
# ./script Oleg
 +
Zdarova Oleg
 +
 +
# ./script Vasya
 +
Privet Vasya
 +
 +
  # ./script Petya
 +
Privet Petya
 +
 +
 +
'''Цикл if с case'''
 +
#!/bin/bash
 +
 +
if [ "$1" == "Vasya" ]; then
 +
    echo "Privet $1"
 +
else [ "$1" == "Petya" ]; then
 +
    echo "Privet $1"
 +
else echo "Zdarova $1"
 +
fi
 +
 +
x=$2
 +
 +
echo "Starting case selection..."
 +
case $x in
 +
          1) echo "This is one";;
 +
      [2-9]) echo "Two-nine";;
 +
    "Petya") echo "Privet $x";;
 +
          *) echo "Parameter unknown"
 +
esac
 +
 +
Результаты
 +
# ./script
 +
Zdarova
 +
Starting case selection...
 +
Parameter unknown
 +
 +
# ./script Oleg 3
 +
Zdarova Oleg
 +
Starting case selection...
 +
Two-nine
 +
 +
# ./script Petya 1
 +
Privet Petya
 +
Starting case selection...
 +
This is one
 +
 +
# ./script Vasya Petya
 +
Privet Vasya
 +
Starting case selection...
 +
Privet Petya
 +
 +
# ./script Petya Alex
 +
Privet Petya
 +
Starting case selection...
 +
Parameter unknown
 +
 +
 +
Интерактивный ввод параметра
 +
#!/bin/bash
 +
 +
if [ "$1" == "Vasya" ]; then
 +
    echo "Privet $1"
 +
else [ "$1" == "Petya" ]; then
 +
    echo "Privet $1"
 +
else echo "Zdarova $1"
 +
fi
 +
 +
echo "Please entrer something: "
 +
read x
 +
 +
# read -p "Please entrer something: " x - второй вариант
 +
 +
echo "Starting case selection..."
 +
case $x in
 +
          1) echo "This is one";;
 +
      [2-9]) echo "Two-nine";;
 +
    "Petya") echo "Privet $x";;
 +
          *) echo "Parameter unknown"
 +
esac
 +
 +
Результат
 +
# ./script Oleg
 +
Zdarova Oleg
 +
Enter something: 2
 +
Starting case selection...
 +
Two-nine
 +
и т.д.
 +
 +
 +
'''Циклы'''
 +
 +
#!/bin/bash
 +
 +
COUNTER=0
 +
while [$COUNTER -lt 10]; do
 +
# -lt(less than) - меньше чем
 +
        echo "Current counter is $COUNTER"
 +
        COUNTER=$((COUNTER+1))
 +
done
 +
 +
Результат выведет переменные от 0 до 9
 +
# ./script
 +
Current counter is 0
 +
Current counter is 1
 +
Current counter is 2
 +
Current counter is 3
 +
Current counter is 4
 +
Current counter is 5
 +
Current counter is 6
 +
Current counter is 7
 +
Current counter is 8
 +
Current counter is 9
 +
 +
 +
#!/bin/bash
 +
 +
for myfile in `ls *.txt`; do
 +
    cat $myfile
 +
done
 +
 +
Результат выведет содержимое файлов .txt
 +
# ./script
 +
Text from file1
 +
Text from file2
 +
Text from file3
 +
 +
 +
#!/bin/bash
 +
 +
for x in {1..10}; do
 +
        echo "X = $x"
 +
done
 +
 +
Результат выведет значение переменной от 1 до 10
 +
# ./script
 +
X = 1
 +
X = 2
 +
X = 3
 +
X = 4
 +
X = 5
 +
X = 6
 +
X = 7
 +
X = 8
 +
X = 9
 +
X = 10
 +
 +
 +
#!/bin/bash
 +
 +
for (( i=1; i<=10; i++ )); do
 +
        echo "Nomer N = $i"
 +
done
 +
 +
Результат выведет значение переменной от 1 до 10
 +
# ./script
 +
Nomer N = 1
 +
Nomer N = 2
 +
Nomer N = 3
 +
Nomer N = 4
 +
Nomer N = 5
 +
Nomer N = 6
 +
Nomer N = 7
 +
Nomer N = 8
 +
Nomer N = 9
 +
Nomer N = 10
 +
 +
  
  
Строка 34: Строка 217:
 
По умолчанию, если не указать номер, то будет подразумеваться STDOUT.
 
По умолчанию, если не указать номер, то будет подразумеваться STDOUT.
  
В примере
+
 
 +
В следующем примере
 
  cron job command > /dev/null 2>&1
 
  cron job command > /dev/null 2>&1
 
видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод).<br/>
 
видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод).<br/>
Затем все ошибки (то есть STDERR) перенаправляет в стандартный вывод. Необходимо поставить амперсанд "&" перед номером назначения.
+
Затем все ошибки (то есть STDERR) перенаправляет в стандартный вывод. Перед номером потока, в который перенаправляем вывод, необходимо указывать амперсанд "&"
 +
 
 +
 
 +
Перенаправить все ошибки в файл( <font color=red>>></font> допишет в файл)
 +
cron job command 2> errors.txt
 +
 
 +
 
 +
Перенаправить все нормальные ответы в один файл, а все ошибки в другой
 +
grep <font color=blue>TEXT</font> /etc/* > good.txt 2> errors.txt
 +
 
 +
 
 +
Перенаправить и нормальные ответы и ошибки в один файл
 +
grep <font color=blue>TEXT</font> /etc/* &> all.txt
 +
 
 +
 
 +
'''Завершение и код завершения'''
 +
 
 +
Команда exit может использоваться для завершения работы сценария. Кроме того, она может возвращать некоторое значение, которое может быть проанализировано вызывающим процессом. Каждая команда возвращает код завершения. В случае успеха команда должна возвращать 0, а в случае ошибки -- ненулевое значение, которое, как правило, интерпретируется как код ошибки. Практически все команды и утилиты UNIX возвращают 0 в случае успешного завершения, но имеются и исключения из правил.
 +
 
 +
Аналогичным образом ведут себя функции, расположенные внутри сценария, и сам сценарий, возвращая код завершения. Код, возвращаемый функцией или сценарием, определяется кодом возврата последней команды. Команде exit можно явно указать код возврата, в виде: exit nnn, где nnn -- это код возврата (число в диапазоне 0 - 255).
 +
 
 +
Код возврата последней команды хранится в специальной переменной '''$?''' После исполнения кода функции, переменная '''$?''' хранит код завершения последней команды, исполненной в функции. Таким способом в Bash передается "значение, возвращаемое" функцией. После завершения работы сценария, код возврата можно получить, обратившись из командной строки к переменной '''$?''', т.е. это будет код возврата '''последней''' команды, исполненной в сценарии.
 +
 
 +
Пример
 +
#!/bin/bash
 +
echo hello
 +
echo $?    # код возврата = 0, поскольку команда выполнилась успешно.
 +
 +
lskdf      # Несуществующая команда.
 +
echo $?    # Ненулевой код возврата, поскольку команду выполнить не удалось.
 +
 
 +
echo
 +
 
 +
exit 113  # Явное указание кода возврата 113.
 +
Проверить можно, если набрать в командной строке "echo $?" после выполнения этого примера.
 +
 
 +
В соответствии с соглашениями, 'exit 0' указывает на успешное завершение, в то время как ненулевое значение означает ошибку. Переменная '''$?''' особенно полезна, когда необходимо проверить результат исполнения команды.
 +
 
 +
Символ !, может выступать как логическое "НЕ" для инверсии кода возврата.
 +
 
 +
Пример
 +
true  # встроенная команда "true".
 +
echo "код возврата команды \"true\" = $?"    # 0
 +
 +
! true
 +
echo "код возврата команды \"! true\" = $?"  # 1
 +
Обратим внимание, что символ "!" от команды необходимо отделять пробелом. !true  вызовет сообщение об ошибке "command not found"

Текущая версия на 12:46, 22 сентября 2023

Любой bash скрипт начинается со следующей строки

#!/bin/bash


Переменная $0 - равна имени файла(скрипта). Допустим имя world и скрипт выглядит так

#!/bin/bash
echo "Hello $0"

Запуск скрипта приведёт к выводу на экран

# ./world
Hello world


Все следующие $1, $2 и т.д. переменные, это параметры которые передаём скрипту. Допустим переменные будут vasya, petya.

#!/bin/bash
echo "My $0"
echo 'Privet $1'
echo 'Privet $2'

Результат

# ./script vasya petya
My script
Privet vasya
Privet petya


Цикл if

#!/bin/bash

if [ "$1" == "Vasya" ]; then
   echo "Privet $1"
else [ "$1" == "Petya" ]; then
   echo "Privet $1"
else echo "Zdarova $1"
fi

Результаты

# ./script
Zdarova

# ./script Oleg
Zdarova Oleg

# ./script Vasya
Privet Vasya

 # ./script Petya
Privet Petya


Цикл if с case

#!/bin/bash

if [ "$1" == "Vasya" ]; then
   echo "Privet $1"
else [ "$1" == "Petya" ]; then
   echo "Privet $1"
else echo "Zdarova $1"
fi

x=$2

echo "Starting case selection..."
case $x in
         1) echo "This is one";;
     [2-9]) echo "Two-nine";;
   "Petya") echo "Privet $x";;
         *) echo "Parameter unknown"
esac

Результаты

# ./script 
Zdarova 
Starting case selection...
Parameter unknown

# ./script Oleg 3
Zdarova Oleg
Starting case selection...
Two-nine

# ./script Petya 1
Privet Petya
Starting case selection...
This is one

# ./script Vasya Petya
Privet Vasya
Starting case selection...
Privet Petya

# ./script Petya Alex
Privet Petya
Starting case selection...
Parameter unknown


Интерактивный ввод параметра

#!/bin/bash

if [ "$1" == "Vasya" ]; then
   echo "Privet $1"
else [ "$1" == "Petya" ]; then
   echo "Privet $1"
else echo "Zdarova $1"
fi

echo "Please entrer something: "
read x

# read -p "Please entrer something: " x - второй вариант

echo "Starting case selection..."
case $x in
         1) echo "This is one";;
     [2-9]) echo "Two-nine";;
   "Petya") echo "Privet $x";;
         *) echo "Parameter unknown"
esac

Результат

# ./script Oleg
Zdarova Oleg
Enter something: 2
Starting case selection...
Two-nine

и т.д.


Циклы

#!/bin/bash

COUNTER=0
while [$COUNTER -lt 10]; do
# -lt(less than) - меньше чем
       echo "Current counter is $COUNTER"
       COUNTER=$((COUNTER+1))
done

Результат выведет переменные от 0 до 9

# ./script
Current counter is 0
Current counter is 1
Current counter is 2
Current counter is 3
Current counter is 4
Current counter is 5
Current counter is 6
Current counter is 7
Current counter is 8
Current counter is 9


#!/bin/bash

for myfile in `ls *.txt`; do
    cat $myfile
done

Результат выведет содержимое файлов .txt

# ./script
Text from file1
Text from file2
Text from file3


#!/bin/bash

for x in {1..10}; do
        echo "X = $x"
done

Результат выведет значение переменной от 1 до 10

# ./script
X = 1
X = 2
X = 3
X = 4
X = 5
X = 6
X = 7
X = 8
X = 9
X = 10


#!/bin/bash

for (( i=1; i<=10; i++ )); do
        echo "Nomer N = $i"
done

Результат выведет значение переменной от 1 до 10

# ./script
Nomer N = 1
Nomer N = 2
Nomer N = 3
Nomer N = 4
Nomer N = 5
Nomer N = 6
Nomer N = 7
Nomer N = 8
Nomer N = 9
Nomer N = 10



Стандартные ввод, вывод и ошибка
Существует три стандартных значения ввода и вывода для программ. Ввод получают от клавиатуры (интерактивная, диалоговая программа), или из программы, обрабатывающей вывод другой программы.
Результат программы обычно печатается в стандартной вывод и иногда в файл «STDERR» (ошибка).
Все это три дескриптора файла, которые часто называют STDIN, STDOUT и STDERR.

Но часто к ним обращаются не по имени, а по номеру:
0 — STDIN, 1 — STDOUT и 2 — STDERR
По умолчанию, если не указать номер, то будет подразумеваться STDOUT.


В следующем примере

cron job command > /dev/null 2>&1

видно, что команда направляет свой стандартный вывод в /dev/null (псевдоустройство, которое может принять произвольный объём данных, не сохраняя их совершенно нигде, следовательно, подавив стандартный вывод).
Затем все ошибки (то есть STDERR) перенаправляет в стандартный вывод. Перед номером потока, в который перенаправляем вывод, необходимо указывать амперсанд "&"


Перенаправить все ошибки в файл( >> допишет в файл)

cron job command 2> errors.txt


Перенаправить все нормальные ответы в один файл, а все ошибки в другой

grep TEXT /etc/* > good.txt 2> errors.txt


Перенаправить и нормальные ответы и ошибки в один файл

grep TEXT /etc/* &> all.txt


Завершение и код завершения

Команда exit может использоваться для завершения работы сценария. Кроме того, она может возвращать некоторое значение, которое может быть проанализировано вызывающим процессом. Каждая команда возвращает код завершения. В случае успеха команда должна возвращать 0, а в случае ошибки -- ненулевое значение, которое, как правило, интерпретируется как код ошибки. Практически все команды и утилиты UNIX возвращают 0 в случае успешного завершения, но имеются и исключения из правил.

Аналогичным образом ведут себя функции, расположенные внутри сценария, и сам сценарий, возвращая код завершения. Код, возвращаемый функцией или сценарием, определяется кодом возврата последней команды. Команде exit можно явно указать код возврата, в виде: exit nnn, где nnn -- это код возврата (число в диапазоне 0 - 255).

Код возврата последней команды хранится в специальной переменной $? После исполнения кода функции, переменная $? хранит код завершения последней команды, исполненной в функции. Таким способом в Bash передается "значение, возвращаемое" функцией. После завершения работы сценария, код возврата можно получить, обратившись из командной строки к переменной $?, т.е. это будет код возврата последней команды, исполненной в сценарии.

Пример

#!/bin/bash
echo hello
echo $?    # код возврата = 0, поскольку команда выполнилась успешно.

lskdf      # Несуществующая команда.
echo $?    # Ненулевой код возврата, поскольку команду выполнить не удалось.

echo

exit 113 # Явное указание кода возврата 113. Проверить можно, если набрать в командной строке "echo $?" после выполнения этого примера.

В соответствии с соглашениями, 'exit 0' указывает на успешное завершение, в то время как ненулевое значение означает ошибку. Переменная $? особенно полезна, когда необходимо проверить результат исполнения команды.

Символ !, может выступать как логическое "НЕ" для инверсии кода возврата.

Пример

true  # встроенная команда "true".
echo "код возврата команды \"true\" = $?"     # 0

! true
echo "код возврата команды \"! true\" = $?"   # 1

Обратим внимание, что символ "!" от команды необходимо отделять пробелом. !true вызовет сообщение об ошибке "command not found"