Программирование в Bash

Материал из support.qbpro.ru

Bash учебное пособие. Часть 3: Специальные параметры

Специальные параметры, те параметры которые уже установлены и доступны для пользователя. Эти параметры невозможно назначить внутри скрипта. Список таких параметров:

$1 - $9 - Это так называемые позиционные параметры, служат для передачи аргументов командной строки. Если аргументов больше 9, то они должны заключаться в фигурные скобки{} $0 - Имя скрипта который был запущен. $# - Количество аргументов командной строки или позиционных параметров $? - Код с которым была завершена предыдущая команда. Если команда была выполнена удачно, то значение этой переменной будет 0, если же неудачно то не 0. $$ - Номер процесса под которым исполняется данный скрипт, очень удобно использовать в имени файла что бы сделать его уникальным. $! - Номер последнего, запущенного в фоне процесса. $- Список флагов переданных сценарию. Годиться разве что для проверки интерактивного режима. $* - Данный параметр содержит в себе все параметры переданные из командной строки. $@ - То же самое что $*, только каждый параметр представлен отдельно. $_ - Специальная переменная, содержит последний аргумент предыдущей команды.

И так начнем мы с $1-$9.

Создадим script.sh с таким содержимым:

#!/bin/bash
# 
POS1="$1"
POS2="$2"
POS3="$3"
echo "$1 первый параметр, \$1."
echo "$2 второй параметр, \$2."
echo "$3 третий параметр, \$3."
echo
echo "$POS1, $POS2, $POS3 параметры" '$1'"," '$2'"," '$3'","

Запускам script.sh с параметрами a v b:

./script.sh a v b

На экране мы увидим:

a первый параметр, $1.
v второй параметр, $2.
b третий параметр, $3.
a, v, b параметры $1, $2, $3,


Специальный параметр $0

Создадим script.sh с таким содержимым:

#!/bin/bash
#
echo "Имя сценария: $0"

Запукаем и получим:

script.sh


Специальный параметр $#

Создадим script.sh с таким содержимым:

#!/bin/bash
#
POS1="$1"
POS2="$2"
POS3="$3"
echo "$1 первый параметр, \$1."
echo "$2 второй параметр, \$2."
echo "$3 третий параметр, \$3."
echo
echo "Всего параметров: $#"

Запускам script.sh с параметрами a v b:

./script.sh a v b

И получим :

a первый параметр, $1.
v второй параметр, $2.
b третий параметр, $3.
Всего параметров: 3


Специальный параметр $$

Создадим script.sh с таким содержимым:

#!/bin/bash
#
TEMFILE=tmp.$$
touch $TEMFILE
ls -1 tmp.*

Запускаем скрипт и получаем:

tmp.20375

где 20375 уникальный номер процесса.

Специальный параметр $!

Создадим script.sh с таким содержимым:

#!/bin/bash
#
COM="ps ax"
echo "Вывод на экран номера процессов запущенных команд"
echo
echo -n "Номер процесса ""$COM"":  "
${COM} &
echo $!

Результатом будет:

Номер процесса ps ax: 20478


Специальный параметр $*

Создадим script.sh с таким содержимым:

#!/bin/bash
#
POS1="$1"
POS2="$2"
POS3="$3"
echo "$POS1 первый параметр, \$1."
echo "$POS2 второй параметр, \$2."
echo "$POS3 третий параметр, \$3."
echo
echo "Все параметры одной строкой: $*"

Запускам script.sh с параметрами a v b:

./script.sh a v b

Результатом будет:

a первый параметр, $1.
v второй параметр, $2.
b третий параметр, $3.

Все параметры одной строкой: a v b

Специальный параметр $@

Создадим script.sh с таким содержимым:

#!/bin/bash
#
N=1
for ARG in "$@"
do
echo "Входной параметр #$N = $ARG"
N=$[$N+1]
done

Запускаем его:

./script.sh a v b

Результатом будет:

Входной параметр #1 = a
Входной параметр #2 = v
Входной параметр #3 = b


Специальный параметр $?

При помощи данного параметра очень удобно проверить результат выполнения какой либо команды. Пример:

#!/bin/bash
#
PORT=$1
netstat -ln|grep "$PORT" &> /dev/null
if [ $? -eq 0 ]; then
echo "$PORT поднят. "'$?'"=$?"
else
echo "$PORT не поднят. "'$?'"=$?"
fi

Запускаем его:

./script.sh :80

И если Apache поднят на локальном компьютере, то мы увидим:

:80 поднят. $?=0

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

./script.sh :60000

Результат будет:

:60000 не поднят. $?=1


Специальный параметр $_

Создадим script.sh с таким содержимым:

#!/bin/bash
#
netstat -ln &> /dev/null
echo $_

Запускаем сценарий, и результатом будет:

-ln

ИСТОЧНИКИ: