[bash] bash 스크립트에서 첫 번째 인수를 제외한 모든 인수를 처리하십시오.

첫 번째 인수가 파일 이름을 위해 예약 된 간단한 스크립트가 있으며 다른 모든 선택적 인수는 스크립트의 다른 부분으로 전달되어야합니다.

Google을 사용 하여이 위키를 찾았 지만 문자 그대로의 예를 제공했습니다.

echo "${@: -1}"

나는 다음과 같이 다른 일을 할 수 없다.

echo "${@:2}"

또는

echo "${@:2,1}"

터미널에서 “잘못된 대체”를 얻습니다.

문제는 무엇이며 첫 번째 인수를 제외한 모든 인수를 bash 스크립트에 어떻게 처리합니까?



답변

이것을 사용하십시오 :

echo "${@:2}"

다음 구문 :

echo "${*:2}"

로하기 때문에, 잘 작동하지만,하지 않는 것이 좋습니다 @Gordon는 이미 설명, 사용하는 것을 *, 그것은, 공백 하나의 인수로 함께 모든 인수를 실행하는 동안 @보존 그들 사이의 휴식 시간 (심지어 자신에 공백이 포함 된 인수의 몇 가지 경우 ). 와의 차이점은 echo없지만 많은 다른 명령에 중요합니다.


답변

/bin/sh시도해 볼만한 솔루션을 원한다면

first_arg="$1"
shift
echo First argument: "$first_arg"
echo Remaining arguments: "$@"

shift [n]위치 매개 변수를 n 번 이동합니다 . shift세트의 값 $1의 값을 $2, 값 $2의 값과 $3의 값을 감소시키는 등, 그리고, $#하나.


답변

http://wiki.bash-hackers.org/scripting/posparams

그것은 사용 설명 shift후 (첫 번째 N 매개 변수를 폐기 할 경우) 및 대량 사용을 구현을


답변

다른 것을 찾고 이걸 발견했습니다. 게시물은 상당히 오래되었지만 bash에서 가장 쉬운 솔루션은 아래에 설명되어 있습니다 (적어도 bash 4). set -- "${@:#}"여기서 #은 앞으로 유지하려는 배열 요소의 시작 번호입니다.

    #!/bin/bash

    someVar="${1}"
    someOtherVar="${2}"
    set -- "${@:3}"
    input=${@}

    [[ "${input[*],,}" == *"someword"* ]] && someNewVar="trigger"

    echo -e "${someVar}\n${someOtherVar}\n${someNewVar}\n\n${@}"

기본적으로 set -- "${@:3}"펄의 교대 와 같이 배열의 처음 두 요소를 터 뜨리고 세 번째 요소를 포함한 나머지 모든 요소를 ​​보존합니다. 마지막 요소도 튀어 나올 수있는 방법이 있다고 생각합니다.


답변