Как получить доступ к аргументам для функций, если имеется более 9 аргументов?

С первыми 9 аргументами, передаваемыми из $1- $9, $10 интерпретируется как $1, а затем 0. Как мне объяснить это и получить доступ к аргументам для функций больше 10?

Спасибо.

Ответы

Ответ 1

Использование:

#!/bin/bash
echo ${10}

Чтобы проверить разницу с 10 $, код в foo.sh:

#!/bin/bash
echo $10
echo ${10}

Тогда:

$ ./foo.sh first 2 3 4 5 6 7 8 9 10
first0
10

То же самое верно, если у вас есть:

foobar=42
foo=FOO
echo $foobar # echoes 42
echo ${foo}bar # echoes FOObar

Используйте {}, когда вы хотите удалить неоднозначность...

my2c

Ответ 2

Если вы используете bash, вы можете использовать ${10}.

Синтаксис

${...}, похоже, соответствует POSIX в данном конкретном случае, но может быть предпочтительнее использовать команду shift следующим образом:

while [ "$*" != "" ]; do
  echo "Arg: $1"
  shift
done

EDIT: Я заметил, что не объяснил, что делает shift. Он просто сдвигает аргументы script (или функции). Пример:

> cat script.sh
echo "$1"
shift
echo "$1"

> ./script.sh "first arg" "second arg"
first arg
second arg

В случае, если это может помочь, вот пример с getopt/shift:

while getopts a:bc OPT; do
 case "$OPT" in
  'a')
   ADD=1
   ADD_OPT="$OPTARG"
   ;;
  'b')
   BULK=1
   ;;
  'c')
   CHECK=1
   ;;
 esac
done
shift $( expr $OPTIND - 1 )
FILE="$1"

Ответ 3

В целом, чтобы быть уверенным, что вся данная строка используется для имени переменной, когда Bash интерпретирует код, вы должны заключить ее в фигурные скобки: ${10}