Bash учебник
Начало работы с Bash
Поиск…
Версии
Версия | Дата выхода |
---|---|
0,99 | 1989-06-08 |
1,01 | 1989-06-23 |
2,0 | 1996-12-31 |
2,02 | 1998-04-20 |
2,03 | 1999-02-19 |
2,04 | 2001-03-21 |
2.05b | 2002-07-17 |
3.0 | 2004-08-03 |
3,1 | 2005-12-08 |
3,2 | 2006-10-11 |
4,0 | 2009-02-20 |
4,1 | 2009-12-31 |
4,2 | 2011-02-13 |
4,3 | 2014-02-26 |
4,4 | 2016-09-15 |
Привет, мир, используя переменные
Создайте новый файл hello.sh
со следующим содержимым и дайте ему исполняемые разрешения с помощью chmod +x hello.sh
.
Выполнить /
./hello.sh
через:./hello.sh
#!/usr/bin/env bash
# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"
# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World
Это приведет к печати Hello, World
до стандартного вывода при его выполнении.
Чтобы сообщить bash, где сценарий вам нужен, нужно указать его в содержащую директорию, обычно с ./
если это ваш рабочий каталог, где .
является псевдонимом текущего каталога. Если вы не укажете каталог, bash
попытается найти скрипт в одном из каталогов, содержащихся в $PATH
среды $PATH
.
Следующий код принимает аргумент $1
, который является первым аргументом командной строки, и выводит его в отформатированной строке, следующей за Hello,
.
Выполнение / выполнение через:
./hello.sh World
#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
Важно отметить, что $1
должен быть указан в двойной кавычки, а не одинарной кавычки. "$1"
по желанию расшифровывается до первого аргумента командной строки, а '$1'
вычисляется до литеральной строки $1
.
Примечание по безопасности:
Прочтите последствия для безопасности, забывая процитировать переменную в оболочках bash, чтобы понять важность размещения текста переменной в двойных кавычках.
Привет, мир
Интерактивная оболочка
Оболочка Bash обычно используется в интерактивном режиме: она позволяет вводить и редактировать команды, а затем выполняет их при нажатии клавиши Return . Многие Unix-подобные и Unix-подобные операционные системы используют Bash в качестве своей оболочки по умолчанию (особенно Linux и macOS). Терминал автоматически запускает интерактивный процесс оболочки Bash при запуске.
Выведите Hello World
, введя следующее:
echo "Hello World"
#> Hello World # Output Example
Заметки
Вы можете изменить оболочку, просто набрав имя оболочки в терминале. Например:
sh
,bash
и т. Д.echo
- это встроенная команда Bash, которая записывает полученные аргументы в стандартный вывод. По умолчанию он добавляет новую строку к выводу.
Неинтерактивная оболочка
Оболочка Bash также может быть запущена неинтерактивно из сценария, в результате чего оболочка не требует взаимодействия с человеком. Интерактивное поведение и сценарий поведения должны быть одинаковыми - важное рассмотрение дизайна оболочки Unix V7 Bourne и транзитно Bash. Поэтому все, что можно сделать в командной строке, можно поместить в файл сценария для повторного использования.
Выполните следующие шаги, чтобы создать сценарий Hello World
:
Создайте новый файл
hello-world.sh
touch hello-world.sh
Сделайте исполняемый файл скрипта, запустив
chmod
+x hello-world.sh
Добавьте этот код:
#!/bin/bash echo "Hello World"
Строка 1 : первая строка скрипта должна начинаться с символьной последовательности
#!
, называемый shebang 1 . Shebang поручает операционной системе запустить/bin/bash
, оболочку Bash, передав ей путь сценария в качестве аргумента.Eg
/bin/bash hello-world.sh
Строка 2 : используется команда
echo
для записиHello World
на стандартный вывод.
Выполните скрипт
hello-world.sh
из командной строки, используя одно из следующих:-
./hello-world.sh
- наиболее часто используемые и рекомендуемые -
/bin/bash hello-world.sh
-
bash hello-world.sh
- предполагая, что/bin
находится в вашей$PATH
-
sh hello-world.sh
-
Для реального использования в производстве вы бы .sh
расширение .sh
(что вводит в заблуждение в любом случае, поскольку это скрипт Bash, а не сценарий sh
) и, возможно, переместите файл в каталог в вашей PATH
чтобы он был доступен вам независимо от того, ваш текущий рабочий каталог, как и системная команда, например cat
или ls
.
К числу распространенных ошибок относятся:
Забыв применить к файлу разрешение на выполнение, то есть
chmod +x hello-world.sh
, в результате./hello-world.sh: Permission denied
выход./hello-world.sh: Permission denied
.Редактирование сценария в Windows, который создает неправильные символы окончания строки, которые Bash не может обрабатывать.
Общим симптомом является
: command not found
где возврат каретки заставил курсор к началу строки, переписав текст перед двоеточием в сообщении об ошибке.Сценарий можно исправить с
dos2unix
программыdos2unix
.Пример использования:
dos2unix hello-world.sh
dos2unix
редактирует файл inline.Используя
sh ./hello-world.sh
, не понимая, чтоbash
иsh
представляют собой отдельные оболочки с различными функциями (хотя, поскольку Bash совместим с обратной связью, противоположная ошибка безвредна).Во всяком случае, просто полагаясь на строку shebang скрипта, гораздо предпочтительнее явно писать
bash
илиsh
(илиpython
илиperl
илиawk
илиruby
или ...) перед именем файла каждого скрипта.Обычная строка shebang, используемая для того, чтобы сделать ваш скрипт более переносимым, заключается в использовании
#!/usr/bin/env bash
вместо жесткого кодирования пути к Bash. Таким образом,/usr/bin/env
должен существовать, но помимо этого,bash
просто должен быть на вашемPATH
. На многих системах/bin/bash
не существует, и вы должны использовать/usr/local/bin/bash
или какой-либо другой абсолютный путь; это изменение позволяет избежать необходимости выяснять детали этого.
1 Также упоминается как sha-bang, hashbang, pound-bang, hash-pling.
Просмотр информации для встроенных модулей Bash
help <command>
Это отобразит страницу справки Bash (ручная) для указанного встроенного устройства.
Например, help unset
покажет:
unset: unset [-f] [-v] [-n] [name ...] Unset values and attributes of shell variables and functions. For each NAME, remove the corresponding variable or function. Options: -f treat each NAME as a shell function -v treat each NAME as a shell variable -n treat each NAME as a name reference and unset the variable itself rather than the variable it references Without options, unset first tries to unset a variable, and if that fails, tries to unset a function. Some variables cannot be unset; also see `readonly'. Exit Status: Returns success unless an invalid option is given or a NAME is read-only.
Чтобы просмотреть список всех встроенных модулей с кратким описанием, используйте
help -d
Hello World с пользовательским вводом
Следующее предложит пользователю ввести, а затем сохранит этот ввод в виде строки (текста) в переменной. Затем переменная используется для предоставления пользователю сообщения.
#!/usr/bin/env bash
echo "Who are you?"
read name
echo "Hello, $name."
Команда read
здесь читает одну строки данных из стандартного ввода в переменное name
. Затем это делается с помощью $name
и печатается по стандарту, используя echo
.
Пример вывода:
$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
Здесь пользователь ввел имя «Мэтт», и этот код использовался, чтобы сказать « Hello, Matt.
,
И если вы хотите добавить что-то к значению переменной во время его печати, используйте фигурные скобки вокруг имени переменной, как показано в следующем примере:
#!/usr/bin/env bash
echo "What are you doing?"
read action
echo "You are ${action}ing."
Пример вывода:
$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
Здесь, когда пользователь вводит действие, во время печати к этому действию добавляется «ing».
Обработка именованных аргументов
#!/bin/bash
deploy=false
uglify=false
while (( $# > 1 )); do case $1 in
--deploy) deploy="$2";;
--uglify) uglify="$2";;
*) break;
esac; shift 2
done
$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"
# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
Hello World в режиме «Отладка»
$ cat hello.sh
#!/bin/bash
echo "Hello World"
$ bash -x hello.sh
+ echo Hello World
Hello World
Аргумент -x
позволяет вам пройти через каждую строку в скрипте. Один хороший пример:
$ cat hello.sh
#!/bin/bash
echo "Hello World\n"
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number)
$ ./hello.sh
Hello World
expr: non-integer argument
Вышеприведенная ошибка не достаточна для отслеживания сценария; однако, используя следующий способ, вы можете лучше понять, где искать ошибку в скрипте.
$ bash -x hello.sh
+ echo Hello World\n
Hello World
+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
Важность цитаты в строках
Цитирование важно для расширения строки в bash. С их помощью вы можете контролировать, как bash анализирует и расширяет ваши строки.
Существует два типа цитирования:
- Слабый : использует двойные кавычки:
- Сильный : использует одинарные кавычки:
Если вы хотите использовать bash, чтобы расширить свой аргумент, вы можете использовать Weak Quoting :
#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
Если вы не хотите использовать bash для расширения своего аргумента, вы можете использовать Strong Quoting :
#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
Вы также можете использовать escape для предотвращения расширения:
#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
Для получения более подробной информации, кроме деталей новичка, вы можете продолжить читать ее здесь .