The shift at linux

Bash shift builtin command

On Unix-like operating systems, shift is a builtin command of the Bash shell. When executed, it shifts the positional parameters (such as arguments passed to a bash script) to the left, putting each parameter in a lower position.

Description

When you run shift, the current positional parameters are shifted left n times. Positional parameter x is given the value of parameter x+n. If parameter x+n does not exist, parameter x is unset.

If not specified, the default value of n is 1. So the commands «shift 1» and «shift» (with no argument) do the same thing.

If a parameter is shifted to a position with a number less than 1, it «falls off» — its value is discarded. So the command shift always discards the previous value of $1, and shift 2 always discards the previous values of $1 and $2.

The special positional parameter $0 is excluded from all shift operations, and never modified by the shift command.

Syntax

The shift command takes only one argument:

n The number of positions that parameters should be shifted to the left. This value can be any non-negative integer. If n is zero (0), no parameter shift will be performed. The default value of n is 1.

Exit status

When shift exits, it returns an exit status of 0 (no error), unless: n is negative, or n is greater than the current number of positional parameters, in which case exit status is nonzero.

Positional parameters in bash

In bash, whenever a command is executed, the environment for that command includes special variables containing the individual parameters given to the command.

The name of these variables is a number, corresponding to the position of that parameter on the command line.

For instance, consider the following command:

This command has three positional parameters, numbered as follows:

Parameter Position Description
mv 0 The mv command, which moves files. In this case, it renames file_old.txt to file_new.txt by «moving» it to the new file name.
file_old.txt 1 The original file name.
file_new.txt 2 The new file name.

The first parameter, 0, contains the name of the command. If there are no arguments, this will be the only positional parameter.

When arguments are included after a command, each is stored in the shell variables named 1, 2, etc. Like any other shell variables, their value can be referenced by putting a dollar sign before the variable name. So the value of positional parameter 1 can be referenced with $1, the value of parameter 2 can be referenced with $2, etc.

Parameters with a number 10 or greater can be referenced by putting the number in brackets, for example $ , $ , or $ .

Bash keeps track of the total number of positional parameters. This number is stored in the special shell variable $#.

The value of $# decreases by n every time you run shift.

Special positional parameter zero

Positional parameter zero (0) contains the name of the command that was used to start the current process, as it was executed. You can always find out what command was used to launch the current process by checking the value of this variable.

For instance: from a bash prompt, you can run echo $0 to see the command that launched your current bash session:

This is the location of the bash executable.

There are different ways to run an executable file, however — for instance, many programs are executed using a symlink (symbolic link). If you run a command using a symlink, $0 contains the name of the link you used.

Читайте также:  Что делать если при запуске windows открывается браузер

For instance, you can create a symlink to bash in your home directory:

And make the symlink executable, using chmod:

Then, you can start a new bash child process by executing the symlink:

You’re now in a new bash shell, inside your previous shell. If you run echo $0, you’ll see the difference:

This is the complete path to your home directory, as expanded by bash when you used the alias

(a tilde). You can type exit now, to return to your original bash shell.

Examples

Shifting parameters

Let’s create a script that accepts arguments. We’ll look at how arguments are stored in the environment as positional parameters, and how shift affects them.

Create a new script with your favorite text editor, such as pico or vim. The script should look like this:

The first line, which begins with #! (a «shebang») defines which shell program should be used to run the script.

The second line («shift 0«) does nothing — yet. After we run the script like this, we’ll change 0 to another number.

Now, save this to a file called myargs.sh, and exit the text editor.

Make myargs.sh executable:

Then run it, and give it some arguments:

In this output, we can see the values of positional parameters 04. (The value of $5 is «five«, but we aren’t using that value in our script.)

These values are specific to our current command — the script. When the script is done, these values revert to their values before the script was run. So now, at the command prompt, you can run:

These are the values for our bash session. $0 is the location of the bash executable, and the other parameters have no value.

Now let’s change shift 0 to shift 1. Open the script in your text editor and change the second line so the script looks like this:

Everything after the hash mark («#«) on line 2 is a comment, and is ignored when the script runs.

Save the file and exit the text editor. Then, run the script again:

Notice that the position of all the parameters are shifted down by one. The original value of $1 was discarded, and the value of $5 is now at $4. The value of $0 has not changed.

But, running shift only once isn’t very useful. Usually, you will want to run it several times, in a loop. We can re-write the above script as a loop, where each iteration shifts the parameters once. In your text editor, change the script to look like this:

Notice that shift is the last command in the loop. This allows us to do something to the parameters before they are shifted. Then, as a final step, we shift the parameters and run the loop again.

Save your changes, exit the text editor, and run the script. It will loop five times (with i incrementing from 0 to 4, once per loop). Each loop will shift the values once, and echo the values 04 to the terminal.

Now that we’ve seen how parameters are shifted, let’s create a script with a practical purpose.

Real-world example

The following script, clean-old-files.sh, accepts a list of directory names as parameters on the command line. It scans each named directory for any files that haven’t been accessed in more than a year, and deletes them.

Let’s look at the individual parts of this script, and analyze what they do:

In this if conditional statement, the script checks if there are any arguments. The test uses single-bracket notation ( [] ), which is equivalent to using the builtin command test. The special shell variable $# holds the total number of positional parameters. If its value is equal to zero, that means the user didn’t provide any directory names, so we echo a help message and terminate the script with an error (exit status 1).

Читайте также:  Ошибка 691 билайн windows 10

Otherwise, we proceed to the outer while loop, which uses double-parentheses evaluation to see if $# is true — that is, if its value is anything other than zero. Every time the loop starts, if $# is zero, the expression evaluates as false and the loop exits.

The expressions (( «$#» )) and [ «$#» != «0» ] give equivalent results, and are functionally interchangeable.

Next, let’s look at both sides of the inner while loop:

This line says: while there are read items that are delimited ( -d ) by a null character ( $’\0′ ), read one item into the variable file, then perform the commands inside the loop.

The items are provided by the line at the end of the loop:

This line says: find all files, beginning the search in the directory dir1 (in positional parameter $1), that were last accessed (-atime) more than ( + ) 365 days ago. Delimit the list of matching file names with null characters (-print0).

Источник

20.1. Команда shift

20.1. Команда shift

При передаче сценарию параметров потребуется соответствующий метод обработки, использующий возможности команды shift. В результате выполнения этой команды позиционные аргументы смещаются влево на один элемент. Чтобы уточнить принцип действия команды shift, рассмотрим простой сценарий. Здесь применяется цикл while, обеспечивающий отображение на экране всех аргументов, переданных сценарию.

while [ $# -ne 0 ] # цикл выполняется до тех пор, пока остаются аргументы

Создается впечатление, что указанный сценарий будет выполняться до тех пор, пока в командной строке не останется аргументов. К сожалению, это не так. При запуске сценария на экран выводится только первый аргумент, поскольку в сценарии не предусмотрен переход к следующему параметру. Вот результат выполнения вышеприведенного сценария:

$ opt2 файл1 файл2 файлЗ

файл1 файл1 файл1

Читайте также

4.6.3. Команда cat

4.6.3. Команда cat Команда cat часто используется для создания файлов (хотя можно воспользоваться и командой touch). По команде cat на стандартный вывод (т. е. на экран) выводится содержимое указанного файла (или нескольких файлов, если их имена последовательно задать в качестве

4.6.4. Команда cp

4.6.4. Команда cp Хотя для копирования файлов иногда пользуются командой cat, но в Linux существует для этого специальная команда cp. Ее можно применять в одной из двух форм:[user]$ cp [options] source destination[user]$ cp [options] source_directory new_directoryВ первом случае файл или каталог source копируется,

4.6.5. Команда mv

4.6.5. Команда mv Если вам необходимо не скопировать, а переместить файл из одного каталога в другой, вы можете воспользоваться командой mv. Синтаксис этой команды аналогичен синтаксису команды cp. Более того, она сначала копирует файл (или каталог), а только потом удаляет

5.4.3 Команда cat

5.4.3 Команда cat Мы уже рассматривали кратко команду cat в предыдущем разделе. В данном разделе эта команда интересует нас в основном потому, что чаще всего она работает как раз с входным и выходным потоками. По умолчанию выход команды cat направляется в выходной поток. Чтобы

5.10. Команда sh

5.10. Команда sh Вы всегда можете запустить новый экземпляр оболочки bash, дав команду bash или sh. При этом можно заставить новый экземпляр оболочки выполнить какой-то скрипт, если передать имя скрипта в виде аргумента команды bash. Так, для выполнения скрипта myscript надо дать

8.4.1. Команда ps

8.4.1. Команда ps Когда я заглянул в man-страницу, посвященную команде ps, я был поражен, как много у нее разных опций. Как оказалось, GNU-версия этой программы, входящая в состав Linux, поддерживает опции в стиле трех разных типов UNIX. Опции в стиле Unix98 состоят из одного или нескольких

8.4.2. Команда top

8.4.2. Команда top Команда ps позволяет сделать как бы «моментальный снимок» процессов, запущенных в системе. В отличие от ps команда top отображает состояние процессов и их активность «в реальном режиме времени». На рисунке 8.5 изображено окно терминала, в котором запущена

Команда

Команда Команда используется для выполнения SQL-запросов к базе данных Важно не путать команду, которая является СОМ-объектом, с текстом команды, который представляет собой строку. Обычно команды используют для описания данных, например для создания таблицы и

Читайте также:  Media cache files adobe mac os

Эффект Pitch Shift (Сдвиг высоты)

Эффект Pitch Shift (Сдвиг высоты) Эффект Pitch Shift (Сдвиг высоты) программы Sound Forge может быть применен для изменения высоты тона без изменения длины аудиоданных, которое обычно сопровождает изменение тона. Чтобы настроить и применить данный эффект, необходимо выполнить следующие

3.2. Команда at

3.2. Команда at Команда at позволяет передавать задания демону cron для одноразового выполнения в назначенное время. Выдавая задание, команда at сохраняет в отдельном файле как его текст, так и все текущие переменные среды. Заметим, что команда crontab не делает этого. По умолчанию

5.3. Команда cat

5.3. Команда cat Команда cat довольно проста, но универсальна. Эту команду удобно применять как для отображения файла, так и для его создания, а также при отображении файлов, содержащих управляющие символы. Используя команду cat, следует учитывать, что процесс вывода не

20.1.1. Простой способ использования команды shift

20.1.1. Простой способ использования команды shift Для обработки каждого передаваемого аргумента достаточно воспользоваться командой shift. Ниже приводится соответствующий сценарий:$ pg opt2#!/bin/sh# oPt21оор=0while [ $# -ne 0 ] # цикл выполняется до тех пор, пока остаются аргументы doecho $1shift

20.1.3. Преобразования файла с помощью команды shift

20.1.3. Преобразования файла с помощью команды shift Использование возможностей команды shift значительно облегчает работу с опциями командной строки. Рассмотрим сценарий, выполняющий преобразование регистра символов. При этом будет применяться команда tr.При выполнении

24.1.2. Команда set

24.1.2. Команда set Команда set рассматривалась при изучении процесса отладки для подключения и отключения опций. Эту команду можно также использовать для передачи аргументов в пределах сценария. Опишем, как происходит этот процесс. Предположим, что сценарий должен

Источник

The shift at linux

Команда shift является одной из встроенных команд Bourne, которая поставляется с Bash. У этой команды есть один аргумент — число. Это число N указывает, на сколько позиций позиционные параметры смещаются влево. Позиционные параметры от N+1 до $# будут переименованы и будут иметь имена от $1 до $# — N+1.

Скажем, у вас есть команда, у которой 10 аргументов, и N равен 4, тогда $5 становится $1 , $6 становится $2 и так далее. $10 становится $6 , а первоначальные $1 , $2 , $3 и $4 отбрасываются.

Если N равно нулю или больше $# (общее количество аргументов, смотрите раздел «Проверка аргументов командной строки»), то позиционные параметры не изменяются и команда не действует. Если N не присутвует, то полагается, что оно равно 1. Код возврата равен нулю, если N не больше $# и не меньше нуля, в противном случае код возврата отличен от нуля.

Примеры

Просто проверка, демонстрирующая описанное выше:

Инструкция сдвига shift обычно используется, когда количество аргументов в команде заранее неизвестно, например, когда пользователи могут указать столько аргументов, сколько захотят. В таких случаях, аргументы, как правило, обрабатываются в цикле while с проверкой условия (( $# )). Это условие является истинным, если количество аргументов больше нуля. Каждый аргумент обрабатывается с использованием переменной $1 и инструкции shift. Каждый раз, когда выполняется команда shift, количество аргументов уменьшается, и когда оно, в конечном счете, становится равным нулю, происходит выход из цикла while .

В приведенном ниже примере cleanup.sh инструкция shift используется для обработки каждого файла из списка, созданного с помощью команды find:

Указанную выше команду find можно заменить следующим образом:

Команда xargs создает из стандартного входного потока командные строки и их выполняет. Преимущество в том, что командная строка заолняется до тех пор, пока не будет достигнут предел, определенный системой. Только после этого команда будет вызвана на исполнение; в приведенном выше примере это команда rm. Если еще есть аргументы, будет взята новая строка, которая будет заполняться до тех пор, пока это будет возможно или пока не закончатся аргументы. То же самое можно сделать с помощью вызова find -exec ; но в этом случае команда будет выполняться для найденных файлов каждый раз, когда будет найден очередной файл. Следовательно, команда xargs значительно увеличит скорость работы вашего скрипта и повысит производительность вашей машины.

В следующем примере, мы изменили скрипт из раздела «Встраиваемые документы» так, что он может за один раз устанавливать сразу несколько пакетов:

Источник

Оцените статью
-exec или xargs