Как пропустить первый аргумент в скрипте
В Linux Pocket Guide есть хороший пример того, как перебирать все аргументы в скрипте
for arg in $@ do echo "I found the argument $arg" done
Я пишу сценарий, в котором все аргументы будут текстовыми файлами, и я буду конкатенировать все эти текстовые файлы и распечатать их на stdout, однако я должен исключить содержимое первого аргумента. Мой первый подход был бы чем-то вроде этого
- Что означает status_of_proc по скобкам-скобкам?
- Переименование или создание уникальных имен файлов
- Bash: вычислить время, прошедшее между двумя временными метками
- Почему я получаю незаконный номер: {1..3}
- Правильный способ использования shebang для bash
for arg in $@ do cat "$arg" done
Однако это будет включать первый аргумент, и, как я уже упоминал, я хочу напечатать все, кроме первого.
- Псевдотерминальное сообщение в скрипте
- Запустите несколько сценариев и продолжайте работу до тех пор, пока не будет выполнен каждый сценарий
- Как проверить, открыт ли конкретный порт на машине из сценария оболочки и выполнить действие на основе этого?
- Symlink для файла, который еще не существует
- Перечисление «компьютеров, подобных мне» в моей подсети?
- Как вычислить процент столбца файла?
- Уведомление слушателя, странное поведение
- Как читать пользовательский ввод строки за строкой до Ctrl + D и включать строку, в которой набирается Ctrl + D
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