MyTetra Share
Делитесь знаниями!
shift / смещение переменных на заданное число
Время создания: 31.08.2017 20:51
Текстовые метки: code
Раздел: bash - команды
Запись: xintrea/mytetra_db_mcold/master/base/1501680539pbh3721tw0/text.html на raw.githubusercontent.com

Встроенная команда shift

Что эта команда делает?

Команда 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 не больше $# и не меньше нуля, в противном случае код возврата отличен от нуля.

Примеры

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

[john@fenix testdir] cat test.sh
#!/bin/bash
echo "$@"
shift 4
echo "$@"

После запуска:

[john@fenix testdir] ./test.sh 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
5 6 7 8 9 10

[john@fenix testdir] ./test.sh 1 2 3
1 2 3
1 2 3

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

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

#!/bin/bash

# This script can clean up files that were last accessed over 365 days ago.

USAGE="Usage: $0 dir1 dir2 dir3 ... dirN"

if [ "$#" == "0" ]; then
        echo "$USAGE"
        exit 1
fi

while (( "$#" )); do

if [[ $(ls "$1") == "" ]]; then 
        echo "Empty directory, nothing to be done."
  else 
        find "$1" -type f -a -atime +365 -exec rm -i {} \;
fi

shift

done

 

-exec или xargs

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

find options | xargs [commands_to_execute_on_found_files]

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

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

#!/bin/bash
if [ $# -lt 1 ]; then
        echo "Usage: $0 package(s)"
        exit 1
fi
while (($#)); do
        yum install "$1" < CONFIRM
y
CONFIRM
shift
done
 
MyTetra Share v.0.65
Яндекс индекс цитирования