Intereting Posts
Как я могу перечислить файлы по классу / индикатору (как в ls -classify), а затем по имени? Как функция разрешена во время выполнения? сообщение пользователю после первого входа Как я могу перестать видеть скрытые файлы в Midnight Commander? Почему каталог / lost + found 16K вместо 4K байтов? Печать строк из одного файла, если их часть отображается в другом. Оба файла имеют длину в миллионы строк Yum Broke По какой-то причине «Нет такого файла или каталога» после выполнения ссылки Как я могу заставить imwheel оставить большинство действий модификатора по умолчанию? Regex – проверка скрипта для разрешенных символов Невозможно chroot bash после установки RUNPATH в ld-linux-x86-64.so.2 с patchelf 0.6 и 0.8 Запустить уведомление-демон в качестве службы Печать только git commit sha и шаблон с помощью sed Как безопасно отменить поиск dns на ip в сценарии оболочки Что еще может сломаться, если я удалю экспорт из переменной?

Как пропустить первый аргумент в скрипте

В Linux Pocket Guide есть хороший пример того, как перебирать все аргументы в скрипте

for arg in $@ do echo "I found the argument $arg" done 

Я пишу сценарий, в котором все аргументы будут текстовыми файлами, и я буду конкатенировать все эти текстовые файлы и распечатать их на stdout, однако я должен исключить содержимое первого аргумента. Мой первый подход был бы чем-то вроде этого

 for arg in $@ do cat "$arg" done 

Однако это будет включать первый аргумент, и, как я уже упоминал, я хочу напечатать все, кроме первого.

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

 shift for arg in "$@" do cat "$arg" done 

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

 arg1=$1 shift for arg in "$@"; do cat "$arg" done 

Вы можете использовать shift builtin для отбрасывания одного или нескольких позиционных параметров, но сначала проверьте количество параметров:

 if [ "$#" > 1 ]; then # Save first parameter value for using later arg1=$1 shift fi 

Вызов shift без какого-либо аргумента, означающего shift 1 .

Пересечение всех позиционных аргументов:

 for arg do : do something with "$arg" done 

В вашем случае вам вообще не нужен цикл, так как cat может работать с несколькими файлами:

 cat -- "$@" 

Вот тест shift вызова, когда нет позиционных аргументов:

 $ for shell in /bin/*sh /opt/schily/bin/[jbo]sh; do printf '[%s]\n' "$shell" "$shell" -c 'shift' done 

Вывод:

 [/bin/ash] /bin/ash: 1: shift: can't shift that many [/bin/bash] [/bin/csh] shift: No more words. [/bin/dash] /bin/dash: 1: shift: can't shift that many [/bin/ksh] /bin/ksh: shift: (null): bad number [/bin/lksh] /bin/lksh: shift: nothing to shift [/bin/mksh] /bin/mksh: shift: nothing to shift [/bin/pdksh] /bin/pdksh: shift: nothing to shift [/bin/posh] /bin/posh: shift: nothing to shift [/bin/sh] /bin/sh: 1: shift: can't shift that many [/bin/tcsh] shift: No more words. [/bin/zsh] zsh:shift:1: shift count must be <= $# [/opt/schily/bin/bsh] shift: cannot shift. [/opt/schily/bin/jsh] /opt/schily/bin/jsh: cannot shift [/opt/schily/bin/osh] /opt/schily/bin/osh: cannot shift 

Ну, bash молчал, не имея позиционных аргументов. Вызов с помощью заполнителя в $0 :

 "$shell" -c 'shift' _ 

сделанные варианты csh и schily bsh тоже молчат. В случае ошибки варианты zsh , csh и schily bsh не покидают неинтерактивный скрипт после сообщения об этом.

Вы можете использовать сортировку массива ${@:2} :

 $ foo () { echo "The args are ${@:2}" ;} $ foo spam egg bar The args are egg bar