BASH — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показано 19 промежуточных версий этого же участника) | |||
Строка 25: | Строка 25: | ||
− | Цикл if | + | '''Цикл if''' |
#!/bin/bash | #!/bin/bash | ||
Строка 38: | Строка 38: | ||
# ./script | # ./script | ||
Zdarova | Zdarova | ||
+ | |||
# ./script Oleg | # ./script Oleg | ||
Zdarova Oleg | Zdarova Oleg | ||
+ | |||
# ./script Vasya | # ./script Vasya | ||
Privet Vasya | Privet Vasya | ||
− | # ./script Petya | + | |
+ | # ./script Petya | ||
Privet 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 | x=$2 | ||
Строка 55: | Строка 68: | ||
*) echo "Parameter unknown" | *) echo "Parameter unknown" | ||
esac | 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 | ||
Строка 85: | Строка 234: | ||
Перенаправить и нормальные ответы и ошибки в один файл | Перенаправить и нормальные ответы и ошибки в один файл | ||
grep <font color=blue>TEXT</font> /etc/* &> all.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"