bash 스크립트 인수로 제공된 끝에서 위치를 얻는 방법은 무엇입니까? [복사]

bash 스크립트 인수로 제공된 끝에서 위치를 얻는 방법은 무엇입니까? [복사]

쉘 스크립트가 있는데 마지막 매개변수를 사용하고 싶습니다.

#!/bin/bash
echo My last param is #somehow put it here

내가 시도한 것은 다음과 같습니다.

echo $$#
echo ${$#}
echo ${(($#))}

불행히도 그것은 작동하지 않았습니다.

특히 내 옵션이 작동하지 않는 이유를 이해하고 싶습니다. 이중 확장과 같은 작업을 수행하고 싶습니다.

더 넓은 의미에서 마지막 N번째 매개변수에 접근하는 방법을 알고 싶습니다. 어떻게 이를 달성할 수 있나요?

답변1

bash스크립트에서 매개변수를 얻으 려면 슬라이스를 사용할 수 있습니다.

#!/bin/bash

# Get 3rd element from the end
from_end1=3
# Get last element
from_end2=1

# Get slice of array [end - from_end1 : end ] of length 1
echo "${@: -$from_end1: 1}"
echo "${@: -$from_end2: 1}"

이것을 사용하여 N번째 요소를 얻을 수도 있습니다.

# Get 2nd element
from_beginning=2

echo "${@: $from_beginning: 1}"

길이를 확인하세요. 프로그램 이름이나 빈 문자열이 반환될 수 있습니다.

답변2

(버전 4.3+) 에서는 bash전달된 인수를 배열에 할당하고 인덱스로 마지막 인수에 액세스할 수 있습니다 -1.

#!/bin/bash

params=( "$@" )
printf 'The last parameter given to the script is %s\n' "${params[-1]}"

foo () {
    params=( "$@" )
    printf 'The last parameter given to the function is %s\n' "${params[-1]}"
}

일반적으로 배열에 대한 음수 인덱스는 배열 끝에 있는 요소에 액세스합니다.

답변3

또한 (Kusalananda의 답변):

#! /bin/bash 

echo "(bash/ksh): ${@: -1}"
echo "(bash 3.x+): ${!#}"
echo "(bash 3.x+): $BASH_ARGV"
echo "(bash 3.x+/ksh): ${@:$#}"
echo "(bash 3.x+): ${BASH_ARGV[0]}"

이식성이 걱정된다면:

#!/bin/bash

penultimate=''
ultimate=''

for p in "$@" ; do
    penultimate="$ultimate"
    ultimate="$p"
done

echo "penultimate=$penultimate"
echo "ultimate=$ultimate"

답변4

POSIX 셸(ksh, zsh 또는 bash에서도 작동)의 기본 솔루션은 다음과 같습니다.

 for last do :;done; echo "last=$last"
 eval "last=\$$#"; echo "last=$last"

최신 셸(ksh93, zsh, bash)의 경우:

 echo "last=${@: -1}"
 echo "last=${@:(-1)}"
 echo "last=${@:~0}"
 echo "last=${@:$#}"

다음에만 적용됩니다:

echo "last=${!#}"
echo "last=$BASH_ARGV"
echo "last=${@[-1]}"
echo "last=${@[#]}"

두 번째 매개변수의 경우:

 for arg do penultimate=$ultimate; ultimate=$arg; done; echo "$penultimate"
 eval penultimate=\$$((#-1))
 echo "${@:$((#-1)):1}"
 echo "${@: -2:1}"
 echo "${@:~1:1}"

관련 정보