쉘 스크립트에 전달 된 마지막 인수 얻기
$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
또는 last
var 를 설정하려면 다음을 수행하십시오 .
$ 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 '$'"$#"))
설명 (가장 먼저 중첩 됨) :
$(echo '$'"$#")
반환하는$[nr]
경우[nr]
매개 변수의 수입니다. 예를 들어 문자열$123
(확장되지 않음).echo $123
평가시 123 번째 매개 변수의 값을 리턴합니다.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
'Programing' 카테고리의 다른 글
텍스트 파일에서 줄 끝을 찾는 방법은 무엇입니까? (0) | 2020.04.02 |
---|---|
Docker의 이미지를 어떻게 삭제합니까? (0) | 2020.04.02 |
프로그래밍 방식으로 TextView에서 왼쪽 드로어 블을 설정 (0) | 2020.04.02 |
JavaScript에서 정수를 이진수로 변환하는 방법은 무엇입니까? (0) | 2020.04.02 |
Error Domain = NSURLErrorDomain Code = -1005“네트워크 연결이 끊어졌습니다.” (0) | 2020.04.02 |