#! /bin/sh - i=1 for arg do printf '%2d: %s\n' "$i" "$arg" i=$((i + 1)) done
То есть, вместо того, чтобы перебирать индексы, перебирайте аргументы и увеличивайте индекс отдельно.
Несколько замечаний по вашему подходу:
оставление расширения параметра без кавычек в контексте списка имеет особое значение, вы почти никогда не захотите этого делать .
В наши дни следует избегать `...`
формы подстановки команд. Вместо этого используйте $(...)
.
Поскольку подстановка команд без кавычек также вызывает split+glob, ее следует использовать с осторожностью. Здесь вы используете часть split , что означает, что у вас есть зависимость от текущего значения $IFS
. Вывод seq
не будет включать подстановочные знаки, поэтому у вас не будет проблем с частью glob .
seq
не является стандартной командой и встречается не во всех системах. Зацикливаться на числах в любом случае не лучший подход, так как это означает сохранение всего вывода в памяти и его разделение (, что приводит к дополнительным копиям в памяти ), а это означает запуск отдельной утилиты в отдельном процессе, даже если оболочка имеет встроенную поддержку для этого.
Если вы не поместите ни -bang(#! /path/to/interpreter -
первую строку ), единственная гарантия, которую вы получите, это то, что она будет интерпретирована оболочкой POSIX sh
(в более старых версиях. систем, которые могут быть даже оболочкой Bourne (не -POSIX )), поэтому вам необходимо убедиться, что используемый вами синтаксис совместим с POSIX. Даже в системах, где sh
предоставляется bash
, не все расширения bash
включены при работе с sh
.
Приведенный выше код совместим с POSIX (и также будет работать в bash
), но не совместим с Bourne (из-за $((...))
синтаксиса арифметического расширения, который не был доступен в оболочке Bourne ). На Solaris 10 и старше,вам нужно изменить -взрыв на #! /usr/xpg4/bin/sh -
, чтобы получить (в основном )POSIX -совместимый интерпретатор