Programing

쉘 스크립트에 전달 된 마지막 인수 얻기

lottogame 2020. 4. 2. 08:10
반응형

쉘 스크립트에 전달 된 마지막 인수 얻기


$1첫 번째 주장입니다.
$@그들 모두입니다.

쉘 스크립트에 전달 된 마지막 인수를 어떻게 찾을 수 있습니까?


이것은 약간의 해킹입니다.

for last; do true; done
echo $last

이것은 또한 이식성이 뛰어나며 (다시 말해서 bash, ksh 및 sh와 함께 작동해야 함) 인수를 이동시키지 않으므로 멋질 수 있습니다.

for루프 오버 대상을 알려주지 않으면 인수 암시 적으로 반복한다는 사실과 루프 변수의 범위가 지정되지 않았다는 사실을 사용합니다. 설정된 마지막 값을 유지합니다.


이것은 배쉬 전용입니다.

echo "${@: -1}"

$ set quick brown fox jumps

$ echo ${*: -1:1} # last argument
jumps

$ echo ${*: -1} # or simply
jumps

$ echo ${*: -2:1} # next to last
fox

공백은 기본값으로 해석되지 않도록 필요 합니다 .


bash 3.0 이상에 대한 가장 간단한 대답은

_last=${!#}       # *indirect reference* to the $# variable
# or
_last=$BASH_ARGV  # official built-in (but takes more typing :)

그게 다야.

$ cat lastarg
#!/bin/bash
# echo the last arg given:
_last=${!#}
echo $_last
_last=$BASH_ARGV
echo $_last
for x; do
   echo $x
done

출력은 다음과 같습니다

$ lastarg 1 2 3 4 "5 6 7"
5 6 7
5 6 7
1
2
3
4
5 6 7

길이와 결합 된 인덱싱을 사용하십시오.

echo ${@:${#@}} 

다음이 도움이 될 것입니다. @는 인수 배열입니다. : 의미합니다. $ #는 인수 배열의 길이입니다. 결과는 마지막 요소입니다.

${@:$#} 

예:

function afunction{
    echo ${@:$#} 
}
afunction -d -o local 50
#Outputs 50

마지막 인수를 이전의 모든 인수와 분리하려고 할 때 이것을 찾았습니다. 일부 답변은 마지막 인수를 얻지 만 다른 모든 인수가 필요한 경우 큰 도움이되지 않습니다. 이것은 훨씬 잘 작동합니다.

heads=${@:1:$(($# - 1))}
tail=${@:$#}

이것은 모든 POSIX 호환 쉘에서 작동합니다.

eval last=\${$#}

출처 : http://www.faqs.org/faqs/unix-faq/faq/part2/section-12.html


내 솔루션은 다음과 같습니다.

  • 꽤 이식성 (모든 POSIX sh, bash, ksh, zsh)이 작동해야합니다.
  • 원래 인수를 이동하지 않습니다 (사본을 이동).
  • 악을 사용하지 않습니다 eval
  • 전체 목록을 반복하지 않습니다
  • 외부 도구를 사용하지 않습니다

암호:

ntharg() {
    shift $1
    printf '%s\n' "$1"
}
LAST_ARG=`ntharg $# "$@"`

Bash> = 3.0을 사용하는 경우

echo ${BASH_ARGV[0]}

를 들면 bash, 이 댓글은 매우 우아한 제안 :

echo "${@:$#}"

보너스로 이것은에서 작동합니다 zsh.


bash에만 해당 (버전 2.01부터)

$ set -- The quick brown fox jumps over the lazy dog

$ printf '%s\n'     "${!#}     ${@:(-1)} ${@: -1} ${@:~0} ${!#}"
dog     dog dog dog dog

ksh, zsh 및 bash의 경우 :

$ echo "${@: -1}    ${@:~0}"     # the space beetwen `:` and `-1` is a must.
dog   dog

그리고 "다음까지":

$ echo "${@:~1:1}"
lazy

대시 (예 :)로 시작하는 인수와 관련된 문제를 해결하려면 다음을 -n사용하십시오 printf.

$ printf '%s\n' "${@:~0}"
dog

모든 쉘 및 구형 sh(공백 및 글로브 문자와 함께 작동)의 경우 :

$ set -- The quick brown fox jumps over the lazy dog "the * last argument"

$ eval echo "\"\${$#}\""
The last * argument

또는 lastvar 를 설정하려면 다음을 수행하십시오 .

$ eval last=\${$#}; echo "$last"
The last * argument

그리고 "다음까지":

$ eval echo "\"\${$(($#-1))}\""
dog

shift `expr $# - 1`
echo "$1"

인수의 수에서 1을 뺀 수만큼 인수를 이동시키고 마지막 인수가 될 첫 번째 (및 유일한) 나머지 인수를 리턴합니다.

나는 bash에서만 테스트했지만 sh 및 ksh에서도 작동해야합니다.


비파괴적인 방식으로 수행하려면 한 가지 방법은 모든 인수를 함수에 전달하고 마지막 인수를 반환하는 것입니다.

#!/bin/bash

last() {
        if [[ $# -ne 0 ]] ; then
            shift $(expr $# - 1)
            echo "$1"
        #else
            #do something when no arguments
        fi
}

lastvar=$(last "$@")
echo $lastvar
echo "$@"

pax> ./qq.sh 1 2 3 a b
b
1 2 3 a b

실제로 다른 인수를 유지하는 것에 신경 쓰지 않는다면 함수에 필요하지 않지만 다른 인수가 이미 처리되지 않은 한 다른 인수를 유지하고 싶지 않은 상황을 생각하기가 어렵습니다. 이 경우 순차적으로 처리하는 process / shift / process / shift / ... 방법을 사용합니다.

나는 당신 순차적 인 방법을 따르지 않았기 때문에 그것들을 유지하고 싶다고 가정합니다 . 이 메소드는 또한 인수가없는 경우를 처리하여 ""를 리턴합니다. 주석 처리 된 else을 삽입하여 해당 동작을 쉽게 조정할 수 있습니다 .


tcsh의 경우 :

set X = `echo $* | awk -F " " '{print $NF}'`
somecommand "$X"

나는 이것이 과제를 제외하고 휴대용 솔루션 일 것이라고 확신합니다.


다음을 사용하는 솔루션 eval:

last=$(eval "echo \$$#")

echo $last

위의 답변을 읽은 후 PGM.cpp에서 g ++를 실행하여 실행 가능한 이미지 PGM을 생성하는 Q & D 셸 스크립트 (sh 및 bash에서 작동해야 함)를 작성했습니다. 명령 행의 마지막 인수는 파일 이름 (.cpp는 선택 사항)이고 다른 모든 인수는 옵션이라고 가정합니다.

#!/bin/sh
if [ $# -lt 1 ]
then
    echo "Usage: `basename $0` [opt] pgm runs g++ to compile pgm[.cpp] into pgm"
    exit 2
fi
OPT=
PGM=
# PGM is the last argument, all others are considered options
for F; do OPT="$OPT $PGM"; PGM=$F; done
DIR=`dirname $PGM`
PGM=`basename $PGM .cpp`
# put -o first so it can be overridden by -o specified in OPT
set -x
g++ -o $DIR/$PGM $OPT $DIR/$PGM.cpp

다음은 LAST현재 환경을 변경하지 않고 마지막 인수로 설정 됩니다.

LAST=$({
   shift $(($#-1))
   echo $1
})
echo $LAST

다른 인수가 더 이상 필요하지 않고 이동할 수있는 경우 다음과 같이 단순화 할 수 있습니다.

shift $(($#-1))
echo $1

이식성의 이유로 다음을 수행하십시오.

shift $(($#-1));

다음으로 대체 할 수 있습니다.

shift `expr $# - 1`

$()역 따옴표로 대체 하면 다음과 같은 이점이 있습니다.

LAST=`{
   shift \`expr $# - 1\`
   echo $1
}`
echo $LAST

echo $argv[$#argv]

내 답변이 게시하기에 너무 짧았으므로 텍스트를 추가해야합니다. 편집 할 텍스트를 더 추가해야합니다.


@AgileZebra의 답변 (및 @starfry의 의견)이 가장 유용하다는 것을 알았지 만 heads스칼라로 설정 되었습니다. 배열이 더 유용 할 것입니다.

heads=( "${@:1:$(($# - 1))}" )
tail=${@:${#@}}

이것은 내 복사 기능의 일부입니다.

eval echo $(echo '$'"$#")

스크립트에서 사용하려면 다음을 수행하십시오.

a=$(eval echo $(echo '$'"$#"))

설명 (가장 먼저 중첩 됨) :

  1. $(echo '$'"$#")반환하는 $[nr]경우 [nr]매개 변수의 수입니다. 예를 들어 문자열 $123(확장되지 않음).
  2. echo $123 평가시 123 번째 매개 변수의 값을 리턴합니다.
  3. eval$123매개 변수 값으로 확장 됩니다 (예 :) last_arg. 이것은 문자열로 해석되어 반환됩니다.

2015 년 중반 Bash와 함께 작동합니다.


#! /bin/sh

next=$1
while [ -n "${next}" ] ; do
  last=$next
  shift
  next=$1
done

echo $last

마지막 스크립트를 찾으려면 아래 스크립트를 사용해보십시오

 # cat arguments.sh
 #!/bin/bash
 if [ $# -eq 0 ]
 then
 echo "No Arguments supplied"
 else
 echo $* > .ags
 sed -e 's/ /\n/g' .ags | tac | head -n1 > .ga
 echo "Last Argument is: `cat .ga`"
 fi

산출:

 # ./arguments.sh
 No Arguments supplied

 # ./arguments.sh testing for the last argument value
 Last Argument is: value

감사.


이 작업을 수행하는 훨씬 더 간결한 방법이 있습니다. bash 스크립트에 대한 인수는 배열로 가져올 수 있으므로 요소 처리가 훨씬 간단 해집니다. 아래 스크립트는 항상 스크립트에 전달 된 마지막 인수를 인쇄합니다.

  argArray=( "$@" )                        # Add all script arguments to argArray
  arrayLength=${#argArray[@]}              # Get the length of the array
  lastArg=$((arrayLength - 1))             # Arrays are zero based, so last arg is -1
  echo ${argArray[$lastArg]}

샘플 출력

$ ./lastarg.sh 1 2 buckle my shoe
shoe

매개 변수 확장 사용 (일치하는 시작 삭제)

args="$@"
last=${args##* }

마지막 전에도 쉽게 얻을 수 있습니다.

prelast=${args% *}

이 형식은 슬랙웨어 및 Cygwin에서 작동 할 수 있습니다.

"$ {x [@] : (-1)}", $ @과 함께 사용하는 경우 "$ {@ : (-1)}"

$ {@ :( N)}은 N 인덱스 뒤에 모든 요소를 ​​반환합니다 (N 포함). -1이 마지막입니다.


가장 최근에 사용한 매개 변수를 반환합니다.

$_

참고 URL : https://stackoverflow.com/questions/1853946/getting-the-last-argument-passed-to-a-shell-script

반응형