Библиотека сайта rus-linux.net
Руководство по Bash для начинающих | ||
---|---|---|
Назад | Глава 9: Повторяющиеся задачи | Вперед |
Встроенная команда 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 |
В следующем примере, мы изменили скрипт из раздела "Встраиваемые документы" так, что он может за один раз устанавливать сразу несколько пакетов:
#!/bin/bash if [ $# -lt 1 ]; then echo "Usage: $0 package(s)" exit 1 fi while (($#)); do yum install "$1" < CONFIRM y CONFIRM shift done
Предыдущий раздел: | Оглавление | Следующий раздел: |
Создаем меню с помощью встроенной команды select | Подводим итог |