basename.
$ pg param2
#!/bin/sh
echo "Hello world this ls `basename $0` calling"
$ param2
Hello world this ls param2 calling
14.4.2. Передача параметров в системные команды
Параметры можно передавать внутри сценария в системную команду. В следующем примере используется команда find . Параметр $1 указывает имя искомого файла.
$ pg findfile
#!/bin/sh
# findfile
find / -name $1 -print
$ findfile passwd
/etc/passwd
/etc/uucp/passwd
/usr/bin/passwd
Ниже приводится другой пример. В виде параметра $1 файл user‑id передается команде grep; команда grep использует эти сведения для поиска файла passwd, где содержится полное имя пользователя.
$ pg who_is
#!/bin/sh
# who_is
grep $1 passwd | awk -F: {print $4}'
$ who_is seany
Seany Post
14.4.3. Специальные параметры
Теперь, когда вы изучили, как получить доступ к параметрам shell–сценариев и применять их, было бы полезным узнать об этих параметрах больше. Рассмотрим, каким образом сценарий применяет специальные параметры. Существует семь специальных параметров, которые представлены в табл. 14.2.
Таблица 14.2. Специальные параметры интерпретатора shell
| $# | Число аргументов, передаваемых сценарию |
| $* | В отдельной строке отображаются все аргументы, которые передаются сценарию. Здесь может содержаться более девяти параметров, в отличие от позиционных параметров |
| $$ | Текущий идентификатор PID для выполняющегося сценария |
| $! | Идентификатор PID для последнего процесса, который выполняется в фоновом режиме |
| $@ | Означает то же самое, что и параметр $#, но, если параметр заключен в кавычки, то и каждый аргумент отображается в кавычках |
| $- | Отображение текущих опций интерпретатора команд; аналогично применению команды set |
| $? | Показывает код завершения последней команды. Значение 0 свидетельствует об отсутствии ошибок, любое другое значение -o, их наличии |
Преобразуем сценарий param, применяя некоторые специальные параметры. Затем выполним сценарий.
$ pg param
#!/bin/sh
# все параметры
echo "This ls the script name : §0"
echo "This ls the first parameter : $1"
echo "This is the second parameter : $2"
echo "This ls the third parameter : $3"
echo "This ls the fourth parameter : $4"
echo "This ls the fifth parameter : $5"
echo "This ls the sixth parameter : $6"
echo "This ls the seventh parameter : $7"
echo "This ls the eighth parameter : $8"
echo "This ls the ninth parameter : $9"
echo "The number of arguments passed : $#"
echo "Show all arguments : $*"
echo "Show me my process ID : $$"
echo "Show me the arguments in quotes :" "$@"
echo "Did my script go with any errors : $?"
$ param Merry Christmas Mr Lawrence
This ls the script name : ./param
This ls the first parameter : Merry
This ls the second parameter : Christmas
This ls the third parameter : Mr Lawrence
This ls the fourth parameter :
This ls the fifth parameter :
This ls the sixth parameter :
This ls the seventh parameter ;
This ls the eighth parameter :
This ls the ninth parameter :
The number of arguments passed ;3
Show all arguments : Merry Christmas Mr Lawrence
Show me my process ID : 630
Show me the arguments in quotes :"Merry" "Christmas" "Mr Lawrence"
Did my script go with any errors :0
При выводе данных с помощью специальных параметров можно получить много полезной информации о сценарии. Существует возможность проверить, какое число аргументов передается, а также идентификатор процесса этого сценария в том случае, если нужно уничтожить сценарий.
14.4.4. Код завершения последней команды
Обратите внимание, что параметр $? возвращает значение 0. Этот прием можно использовать во всех командах или сценариях, если необходимо выяснить, успешно ли выполнена последняя команда. С помощью этой информации можно продолжить работу со сценарием. Если возвращается значение 0, значит все идет успешно; значение 1 означает появление ошибки.
Ниже приводится пример. Сначала файл копируется в каталог /tmp и с помощью параметра $? проверяется результат.
$ cр ok.txt /tmp
$ echo $?
0
Скопируем файл в несуществующий каталог:
$ cp ok.txt /usr/local/apps/dsf
cp: cannot create regular file '/usr/local/apps/dsf': No such file or
directory
$ echo $?
1
При проверке состояния возврата с помощью параметра $? отображается 1. Это свидетельствует о наличии ошибок. Появляется сообщение о системной ошибке "cp: cannot…", поэтому не требуется проверять код завершения последней команды. Сценарии функционируют с помощью системных команд. Обычно пользователь не заинтересован в отображении большого количества значений. Поэтому выходной поток перенаправляется в системную корзину /dev/null Каким образом пользователь узнает, что последняя команда была успешной? С помощью кода завершения последней команды. Рассмотрим пример, иллюстрирующий изложенный материал.