Linux Pocket Guide에는 스크립트의 모든 매개변수를 확인하는 방법에 대한 좋은 예가 있습니다.
for arg in $@
do
echo "I found the argument $arg"
done
모든 매개변수가 텍스트 파일인 스크립트를 작성 중입니다. 이러한 모든 텍스트 파일을 연결하여 stdout으로 인쇄하지만 첫 번째 매개변수의 내용은 제외해야 합니다. 내 첫 번째 방법은 다음과 같습니다.
for arg in $@
do
cat "$arg"
done
그러나 여기에는 첫 번째 매개변수가 포함되며 앞서 언급한 것처럼 첫 번째 매개변수를 제외한 모든 매개변수를 인쇄하고 싶습니다.
답변1
shift
다음과 같은 명령을 사용할 수 있습니다 .
shift
for arg in "$@"
do
cat "$arg"
done
답변2
당신은 그것을 사용할 수 있습니다옮기다내장 기능은 하나 이상의 위치 인수를 삭제하지만 먼저 인수 수를 확인해야 합니다.
if [ "$#" > 1 ]; then
# Save first parameter value for using later
arg1=$1
shift
fi
shift
논쟁의 여지가 없는 호출입니다 shift 1
.
모든 위치 매개변수를 반복합니다.
for arg do
: do something with "$arg"
done
cat
귀하의 경우 언제 여러 파일을 처리할 수 있기 때문에 루프가 전혀 필요하지 않습니다 .
cat -- "$@"
shift
위치 매개변수 없이 호출을 테스트하는 방법은 다음과 같습니다.
$ for shell in /bin/*sh /opt/schily/bin/[jbo]sh; do
printf '[%s]\n' "$shell"
"$shell" -c 'shift'
done
산출:
[/bin/ash]
/bin/ash: 1: shift: can't shift that many
[/bin/bash]
[/bin/csh]
shift: No more words.
[/bin/dash]
/bin/dash: 1: shift: can't shift that many
[/bin/ksh]
/bin/ksh: shift: (null): bad number
[/bin/lksh]
/bin/lksh: shift: nothing to shift
[/bin/mksh]
/bin/mksh: shift: nothing to shift
[/bin/pdksh]
/bin/pdksh: shift: nothing to shift
[/bin/posh]
/bin/posh: shift: nothing to shift
[/bin/sh]
/bin/sh: 1: shift: can't shift that many
[/bin/tcsh]
shift: No more words.
[/bin/zsh]
zsh:shift:1: shift count must be <= $#
[/opt/schily/bin/bsh]
shift: cannot shift.
[/opt/schily/bin/jsh]
/opt/schily/bin/jsh: cannot shift
[/opt/schily/bin/osh]
/opt/schily/bin/osh: cannot shift
글쎄, bash
침묵, 입장 논쟁은 없습니다. 자리 표시자를 사용하여 전화 $0
:
"$shell" -c 'shift' _
csh
변주 도 했고 샤이 bsh
도 침묵을 지켰다. 오류가 발생하면 var zsh
, csh
Variant 및 schily는 bsh
오류 보고 후 비대화형 스크립트를 종료하지 않습니다.
답변3
이 shift
명령을 사용하여 매개변수를 이동하고 첫 번째 매개변수를 삭제할 수 있습니다. 예는 다음과 같습니다.
arg1=$1
shift
for arg in "$@"; do
cat "$arg"
done
답변4
배열 슬라이싱을 사용할 수 있습니다 ${@:2}
.
$ foo () { echo "The args are ${@:2}" ;}
$ foo spam egg bar
The args are egg bar