Специальные параметры 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/