Специальные параметры bash с примерами
Сейчас пойдет речь о таких параметрах bash как $, $@, $#, $$, $!, $?, $-, $
Для доступа ко всему списку позиционных параметров доступны два специальных параметра $* и $@. За двойными кавычками они оба эквивалентны, оба раскрывают список позиционных параметров, начиная с $1, разделенные пробелами.
В двойных кавычках, однако, они различаются:
- $* в паре двойных кавычек эквивалентен списку позиционных параметров, разделенных первым символом IFS "$1C$2c$3...".
- $@ в паре двойных кавычек эквивалентен списку позиционных параметров, разделенных пробелами без кавычек, т. е., "$1" "$2".."$Н."
Пример 1: Используем Bash $* и $@ для расширения позиционных параметров
В этом примере будут показаны значения, доступны в $* и $@.
Создадим скрипт expan:
#!/bin/bash
export IFS='-'
cnt=1
# Printing the data available in $*
echo "Values of \"\$*\":"
for arg in "$*"
do
echo "Arg #$cnt= $arg"
let "cnt+=1"
done
cnt=1
# Printing the data available in $@
echo "Values of \"\$@\":"
for arg in "$@"
do
echo "Arg #$cnt= $arg"
let "cnt+=1"
done
Затем, выполним этот скрипт, как указано ниже, чтоб увидеть, как $* и $@ работают.
#./expan.sh "This is" 2 3
Values of "$*":
Arg #1= This is-2-3
Values of "$@":
Arg #1= This is
Arg #2= 2
Arg #3= 3
- Вышеприведенный скрипт экспортировал значение IFS (внутренний разделитель полей) с помощью '-'.
- В скрипт передается три параметра $1="This is", $2=" 2"и $ 3 = "3".
- При печати каждого значения специального параметра "$*", он дает только одно значение, которое является целым позиционным параметром, разделенных IFS.
- В то время как "$@" дает вам каждый параметр как отдельное слово.
Пример 2: Используем $# для подсчета позиционных параметров
$# - специальный параметр в bash, который дает число позиционных параметров в десятичном формате.
Создадим следующий скрипт:
#!/bin/bash
if [ $# -lt 2 ]
then
echo "Usage: $0 arg1 arg2"
exit
fi
echo -e "\$1=$1"
echo -e "\$2=$2"
let add=$1+$2
let sub=$1-$2
let mul=$1*$2
let div=$1/$2
echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"
Если число позиционных параметров меньше 2, то скрипт вызовет информацию об использовании:
# ./arithmetic.sh 33
Usage: ./arithmetic.sh arg1 arg2
Пример 3: Параметры процесса - $$ и $!
Специальный параметр $$ выдаст PID шелла. $! дает идентификатор процесса последнего выполненного фонового процесса.
Следующий скрипт печатает идентификатор процесса оболочки и идентификатор последнего выполнения фонового процесса.
#!/bin/bash
echo -e "Process ID=$$"
sleep 1000 &
echo -e "Background Process ID=$!"
Теперь выполним скрипт и проверим PID, который будет выведен.
# ./proc.sh
Process ID=16007
Background Process ID=16008
# ps
PID TTY TIME CMD
15798 pts/0 00:00:00 bash
16008 pts/0 00:00:00 sleep
16010 pts/0 00:00:00 ps
Пример 4: Другие специальные параметры Bash -$?, $-, $_
- $? Дает статус выхода последней выполненной команды.
- $- Параметры, заданные с помощью встроенной команды Set
- $_ Дает последний аргумент предыдущей команды. При запуске оболочки выдает абсолютное имя файла скрипта шелла, который выполняется.
Рассмотрим следующий скрипт:
#!/bin/bash
echo -e "$_"; ## Absolute name of the file which is being executed
/usr/bin/uname # execute the command.
#check the exit status of dbhome
if [ "$?" -ne "0" ]; then
echo "Sorry, Command execution failed !"
fi
echo -e "$-"; #Set options - hB
echo -e $_ # Last argument of the previous command.
В приведенном выше скрипте, последнее предложение "echo -e $" ($нижнее_подчеркивание), а также выведет hB, которое является значением последнего аргумента предыдущей команды. Итак, $ даст значение после расширения
# ./others.sh
./others.sh
Linux
hB
hB
Источник http://www.thegeekstuff.com/2010/05/bash-shell-special-parameters/