2012-06-15 2 views
5

셸 프로그램에 주어진 마지막 두 번째 항목을 가져 오려고합니다. 현재 내가 이런 식으로 작업을 수행합니다쉘 스크립트에서 두 번째 마지막 인수를 얻는 방법은 무엇입니까?

file1_tmp="${@: -2}" 
oldIFS=$IFS 
IFS=" " 
count=0 
for value in $file1; do 
    if [[ count -e 0 ]]; then 
    file1=$value 
    fi 
    count=1 
done 
oldIFS=$IFS 

내가이 일을 훨씬 더 쉬운 방법이 있음을 확신한다. 그렇다면 쉘 스크립트 입력에서 가능한 한 적은 수의 행으로 두 번째 마지막 인수를 얻으려면 어떻게해야합니까?

답변

13
set -- "first argument" "second argument" \ 
     "third argument" "fourth argument" \ 
     "fifth argument" 
second_to_last="${@:(-2):1}" 
echo "$second_to_last" 

공백이있는 인수가 함께 고정되도록하는 인용 부호 참고 - 원래의 솔루션에서는 수행하지 않습니다. 배쉬에서

1
n=$(($#-1)) 
second_to_last=${!n} 
echo "$second_to_last" 
4

/KSH는/zsh을 할 수 있습니다 단순히 $ {@ : 2 : 1} : 첫 번째는하지 않습니다

$ set a b c d 
$ echo $(eval "echo \$$(($#-2))") 
c 
+0

Bourne의에서
$ set a b c d $ echo ${@: -1:1} c 

당신이 평가를 사용할 수있다 셸 zsh에서 작동하지만'$ {@ [- 2]}'는 않습니다. –

+0

이 답변의 인용문은 zsh에서는 맞지만 POSIX 호환 쉘 (bash 또는 ksh 등)에서는 잘못되었습니다. –

+0

이것은 Bourne에서 eval없이 수행 될 수 있습니다 - 예를 들어, 함수 내에서 args를 이동하는 것 :'penultimate() {while [ "$ #"-gt 2]; 교대를해라. 끝난; printf '% s \ n ""$ 1 "; }; 끝에서 두 번째 "$ @"' –

관련 문제