[Video] v20.18 Утилита set. Переназначение позиционных параметров.

В предыдущем видео о написании скриптов я рассказывал о позиционных параметрах. В этом видео я покажу ещё один небольшой скрипт который использует Позиционные параметры.

Работать с позиционными параметрами можно использовать не только при запуске скрипта, но и переназначать их с помощью команды set.

В командной строке можно задать позиционные параметры для оболочки просто выполнив команду set:
~$ set 10 222 333
~$ echo $1
10
~$ echo $2
222
~$ echo $3
333s~$ echo $@
10 222 333
~$ echo $#
3

Так же позиционные параметры можно задавать путём передачи команде set вывод какой-либо утилиты поставив её в Машинописный обратный апостроф.
например:
~$ set `date`
~$ echo $@
Tue Jan 20 10:46:33 CET 2015
~$ echo $1
Tue
~$ echo $2
Jan
~$ echo $3
20
~$ echo $4
10:46:33
~$ echo $5
CET
~$ echo $6
2015
~$ echo $@
Tue Jan 20 10:46:33 CET 2015
~$ echo $#
6

Или, например,
set `cat text.txt`
– передаётся содержимое текстового файла.

В теле скрипта можно перезадавать позиционные параметры используя команду set.
~$ cat script2.sh
# I will copy this file and add additional info - name of the user and time of creation to the name of the file.
filename=$1

set `who am i`
cp $filename $filename.$1.$3.$4.bak

Возникала ли у вас когда-нибудь проблема, что делает вы кусовую или ещё какой документ. Надо сохранять периодически копии файлов, чтобы не потерять результаты в случае каких-либо сбоя или ошибки. Так вот данный скрипт в качестве позиционного параметра принимает имя файла который вы хотите забекапить – тот файл который вы редактируете.
Имя этого файла присваивается переменной filename – используется позиционный параметр $1.
Далее с использованием утилиты set перезначаются позиционные параметры – им присваивается вывод команды “who am i”.
Вот этот вывод:
~$ who am i
alex pts/1 2015-01-20 09:07 (212.20.150.2)

Позиционные параметры становятся следующие:
~$ set `who am i`
~$ echo $1
alex
~$ echo $2
pts/1
~$ echo $3
2015-01-20
~$ echo $4
09:07
~$ echo $5
(212.20.150.2)
~$ echo $@
alex pts/1 2015-01-20 09:07 (212.20.150.2)
~$ echo $#
5

Далее производится копирование сиходного файла. Новому файлу присваивается имя состоящее из имени исходного файла плюс имени пользователя выполнившего скрипт (это актуально если над файлом работают несколько человек), делее дата и время.
cp $filename $filename.$1.$3.$4.bak
Вот результат выполнения скрипта:
~$ ls -l
total 12
-rw-rw-r-- 1 alex alex 178 Jan 20 11:15 script2.sh
-rw-rw-r-- 1 alex alex 403 Jan 14 18:30 script.sh
-rw-rw-r-- 1 alex alex 59 Jan 20 09:50 text.txt
~$ bash script2.sh text.txt
~$
~$ ls -l
total 16
-rw-rw-r-- 1 alex alex 178 Jan 20 11:15 script2.sh
-rw-rw-r-- 1 alex alex 403 Jan 14 18:30 script.sh
-rw-rw-r-- 1 alex alex 59 Jan 20 09:50 text.txt
-rw-rw-r-- 1 alex alex 59 Jan 20 11:27 text.txt.alex.2015-01-20.09:07.bak

Данный скрипт облегчает сохранение результатов работы.

Более правильно было бы использовать утилиту date для установки точного времени копирования.
Скрипт можно преобразовать вот так:
# I will copy this file and add additional info - name of the user and time of creation to the name of the file.
filename=$1

set `who am i`
cp $filename $filename.$1.`date +%F.%T`.bak

Данный скрипт облгчает сохранение результатов работы.

Как ещё можно использовать данный функционал?
Например, Вы можете передавать результаты выполнения какого-либо другого скрипта или программы в другой скрип где данные результаты будут выступать в роли Позиционных параметров. Их можно будет легко присваивать другим переменным и потом с ними легко работать. Конечно результаты первого скрипта должны быть особым образом структутированы – так как их ожидает принять второй скрипт.

На сегодня всё, спасибо за внимание.
Удачи!

Sources:
man set
1
2