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

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

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

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

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

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

4 Solutions collect form web for “Как пропустить первый аргумент в скрипте”

Вы можете использовать команду 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 
  • Как я могу подавить вывод grep, чтобы он возвращал только статус выхода?
  • Как передать файлы, загруженные с помощью wget через tar?
  • Автоматическое резервное копирование и исключение определенных папок
  • Ошибка сценария после команды bc
  • «Список аргументов слишком длинный» для цикла
  • Использование функции, определенной в родительском скрипте
  • Скрипт пытается создать файлы, даже если им это не нужно?
  • объединить два файла csv на основе условия
  • Выбирать столбцы из файла csv переменной длины
  • Как я могу удалить только зарегистрированные файлы в каталоге без каких-либо подсказок?
  • Многопоточность / Викинг в сценарии bash
  • Linux и Unix - лучшая ОС в мире.