쉘 스크립트가 있는데 마지막 매개변수를 사용하고 싶습니다.
#!/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}"