Bash 함수 내부에서 스크립트의 위치 인수를 가져오는 방법이 있나요?

Bash 함수 내부에서 스크립트의 위치 인수를 가져오는 방법이 있나요?

위치 매개변수를 얻기 위해 다음 변수가 사용됩니다.

$1, $2, $3, etc.
$@
$#

그러나 스크립트에 대한 위치 인수와 함수에 대한 위치 인수로 모두 사용될 수 있습니다.

함수 내에서 이러한 변수를 사용하면 함수의 위치 인수가 제공됩니다.

함수 내부에서 스크립트의 위치 매개변수를 가져오는 방법이 있나요?

답변1

아니요, 직접적으로는 아닙니다. 함수 매개변수가 이를 가리기 때문입니다. 그러나 Bash 또는 ksh에서는 스크립트의 인수를 다음에 할당할 수 있습니다.별도의 배열, 그리고 그것을 사용하십시오.

#!/bin/bash
ARGV=("$@")
foo() {
     echo "number of args: ${#ARGV[@]}"
     echo "second arg: ${ARGV[1]}"
}
foo x y z 

배열 번호 매기기는 0부터 시작하므로 다음 $1으로 이동하십시오 .${ARGV[0]}

답변2

Bash를 사용하여 스크립트 인수를 얻는 또 다른 방법은 쉘 변수 BASH_ARGC 및 BASH_ARGV를 사용하는 것입니다.

#!/bin/bash
shopt -s extdebug
test(){
  echo 'number of element in the current bash execution call stack = '"${#BASH_ARGC[*]}"
  echo 'the script come with '"${BASH_ARGC[$((${#BASH_ARGC[*]}-1))]}"' parameter(s)'
  echo 'the first is '"${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}"
  echo 'there is 2 way to get the parameters of this function'
  echo 'the first is to get $1,...,$n'
  echo '$1 = '"$1"
  echo '$2 = '"$2"
  echo 'the second with the use of BASH_ARGC and BASH_ARGV'
  echo 'this function '"${FUNCNAME[0]}"' come with '"${BASH_ARGC[0]}"' parameter(s)'
  echo 'the second is '"${BASH_ARGV[0]}"
  echo 'the first is '"${BASH_ARGV[1]}"
}
essai(){
  test paramtest1 "$3"
}
essai paramessai1 paramessai2 paramessai3

답변3

"$@"POSIX 이식 가능한 솔루션으로서 때로는 원래 인수를 함수 인수에 추가하고 함수 내에서 인수를 이동하는 것이 가능할 수도 있습니다.

#!/bin/sh
foo () {
  printf '%s-' "$@"
  printf '\n'
  # Save function parameters to custom variables
  x="$1"
  y="$2"
  z="$3"
  shift 3
  # At this point, "$@" regained its original value
  printf '%s-' "$x" "$y" "$z" "$@"
  printf '\n'
}
foo 1 2 3 "$@"

통화 예:

$ sh example.sh 4 5 6
1-2-3-4-5-6-
1-2-3-4-5-6-

답변4

쉘에서 명령을 사용하면 shift아래와 같이 모든 위치 매개변수에 액세스할 수 있습니다. 매개변수가 왼쪽으로 이동하여 첫 번째 위치를 차지합니다.

while (( "$#" ))
do
  echo $1
  shift
done

관련 정보