it-gundan.com

첫 번째 인수를 제외한 $ @

이런 식으로 실행되는 셸 스크립트를 작성해야합니다.

./myscript arg1 arg2_1 arg2_2 arg2_3 ....... arg2_#

스크립트 안에 for 루프가 있습니다

for i in [email protected]

그러나 내가 아는 것처럼 $ @에는 $ 1 ~ $ ($ #-1)이 포함됩니다. 그러나 내 프로그램의 경우 $ 1은 $ 2 $ 3 $ 4 등과 분명히 다릅니다. $ 2에서 끝까지 반복하고 싶습니다 ... 어떻게 이것을 달성합니까? 감사합니다:)

46
user40780

먼저, 따옴표없이 [email protected]는 의미가 없으므로 사용해서는 안됩니다. [email protected]는 인용 부호 ("[email protected]")와 목록 컨텍스트에서만 사용해야합니다.

for i in "[email protected]"는 목록 컨텍스트로 규정되지만 여기서는 위치 매개 변수를 반복하기 위해 표준적이고 가장 이식 가능하며 간단한 형식은 다음과 같습니다.

for i
do something with "$i"
done

이제 두 번째 요소부터 시작하여 요소를 반복하려면 표준적이고 가장 이식 가능한 방법은 shift을 사용하는 것입니다.

first_arg=$1
shift # short for shift 1
for i
do something with "$i"
done

shift 이후에 $1였던 것이 목록에서 제거되었지만 ($first_arg에 저장 했음) $2이 (가) 이제 $1에 있습니다. 위치 매개 변수는 왼쪽으로 shifted1 위치입니다 (shift 2를 사용하여 2만큼 이동). 따라서 기본적으로 루프는 두 번째 인수였던 것에서 마지막 것까지 반복됩니다.

bash (및 zshksh93)를 사용하면 다른 방법을 사용할 수 있습니다.

for i in "${@:2}"
do something with "$i"
done

그러나 표준 sh 구문이 아니므로 #! /bin/sh -로 시작하는 스크립트에는 사용하지 않아야합니다.

zsh 또는 yash에서 다음을 수행 할 수도 있습니다.

for i in "${@[3,-3]}"
do something with "$i"
done

세 번째 인수에서 세 번째 인수로 반복합니다.

zsh에서 [email protected]$argv 배열이라고도합니다. 따라서 배열의 시작 또는 끝에서 요소를 팝하려면 다음을 수행하십시오.

argv[1,3]=() # remove the first 3 elements
argv[-3,-1]=()

(shiftzsh을 (를) 1=()로 쓸 수도 있음)

bash에서는 set이 내장 된 [email protected] 요소에만 할당 할 수 있으므로 3 개의 요소를 끝에서 터뜨릴 수 있습니다.

set -- "${@:1:$#-3}"

그리고 세 번째에서 세 번째로 반복하려면 :

for i in "${@:3:$#-5}"
do something with "$i"
done

POSIX, "[email protected]"의 마지막 3 개 요소를 팝하려면 루프를 사용해야합니다.

n=$(($# - 3))
for arg do
  [ "$n" -gt 0 ] && set -- "[email protected]" "$arg"
  shift
  n=$((n - 1))
done
55
Stéphane Chazelas

shift 내장을 원한다고 생각합니다. 이름이 $2에서 $1, $3에서 $2 등.

이처럼 :

shift
for i in "[email protected]"; do
    echo $i
done
10
John

원시인 접근 방식은 항상 있습니다.

first=1
for i
do
        if [ "$first" ]
        then
                first=
                continue
        fi
        something with "$i"
done

[email protected] 그대로 (나중에 사용하려는 경우) 모든 인수를 반복하지만 첫 번째 인수는 처리하지 않습니다.

2
Scott