Как обрабатывать более 10 параметров в оболочке


103

Я использую оболочку bash в Linux и хочу использовать более 10 параметров в сценарии оболочки


8
Обратите внимание, что наличие 10 параметров может сбить с толку. Возможно, было бы лучше использовать вместо этого параметры (например, -a 1или --foo=bar). См. man getopt, man getoptsИ man bashнекоторые варианты для этого.
Mikel

Ответы:


160

Используйте фигурные скобки, чтобы выделить их:

echo "${10}"

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

for arg

или

for arg in "$@"

или

while (( $# > 0 ))    # or [ $# -gt 0 ]
do
    echo "$1"
    shift
done

2
Обратите внимание, что $ {10} будет работать в bash, но ограничит вашу переносимость, поскольку многие реализации sh допускают только однозначные спецификации.
Уильям Перселл

1
@William: есть некоторые оболочки, которые не принимают его, например, исходная устаревшая оболочка Bourne, но в дополнение к оболочкам, которые я перечислил в другом комментарии (Bash, dash, ksh и zsh), она также работает в csh, tcsh и Ясень Бизибокс.
Приостановлено до дальнейшего уведомления.

1
@WilliamPursell ${10}определяется POSIX
Стивен Пенни,

2
Беспокойство о ${10}работе необходимо только при использовании очень старых реализаций, которые не соответствуют стандартам. Вероятно, представляет только исторический интерес ... и все же я еще никогда не использовал его! Я полагаю, потому что лучшая практика диктует, что 10 аргументов - это слишком много, если они не повторяются, и в этом случае вы будете перебирать их, "$@"а не перечислять их.
Уильям Перселл

23

Вы можете иметь до 256 параметров от 0 до 255 с:

${255}

5
Я думаю, что этот предел зависит от оболочки. Bash, dash, ksh и zsh, похоже, не имеют этого. sh -c 'echo ${333}' /usr/bin/*
Приостановлено до дальнейшего уведомления.

3
Моя оболочка легко достигает 2 миллионовset $(seq 2097152); echo ${2097152}
Стивен Пенни
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.