Bash: 위치 매개변수 슬라이싱

Bash: 위치 매개변수 슬라이싱

$@모든 위치 인수를 다른 배열에 먼저 복사하지 않고 Bash에서 섹션을 얻으려면 어떻게 해야 합니까 ?

argv=( "$@" )
echo "${argv[@]:2}";

답변1

다른 배열과 동일한 형식을 사용할 수 있습니다. 두 번째 및 세 번째 요소를 추출하려면 $@다음을 수행할 수 있습니다.

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 

답변2

Bash의 더 많은 배열 슬라이싱 예제

some_array_variable코드에서 사용하는 대신 ( argv귀하의 경우) @해당 변수 이름 대신 사용하세요. 기호는 @다음을 나타냅니다.입력 매개변수 배열, 다른 배열처럼 처리할 수 있습니다. 혼란스럽게도 우리는 이 문자가 거의 항상 $다음과 같은 문자와 쌍을 이루는 것을 보는 데 익숙하기 때문에 이 문자가 배열 자체이고 자체적으로 배열 변수로 사용될 수도 있다는 $@것을 인식하지 못합니다 .@

다음은 몇 가지 예입니다.

입력 매개변수 배열에서 슬라이싱하면 @일반적으로 간단하게 배열을 보고 액세스할 수 있습니다 $@.

# array slicing basic format 1: grab a certain length starting at a certain
# index
echo "${@:2:5}"
#         │ │
#         │ └────> slice length
#         └──────> slice starting index 

# array slicing basic format 2: grab all remaining array elements starting at a
# certain index through to the end
echo "${@:2}"
#         │
#         │
#         └──────> slice starting index 

기억할 만한 더 많은 배열:

다음은 나 자신에게 일반적인 알림이며 이 페이지를 방문하는 다른 사람들에게 도움이 될 수 있습니다.

# store a slice from an array into a new array
new_array=("${@:4}")

# print the entire array
echo "new_array = ${new_array[@]}"

다음은 bash의 일반 배열 슬라이싱 및 배열 요소 액세스에 대한 실행 가능한 예입니다., 에서 영감을 받다이 소스:

( 사용 사례에 따라 필요한 경우 아래 @대신 입력 매개변수 배열로 사용할 수 있습니다 )a

a=(one two three four five six)   # define a new array, `a`, with 6 elements
echo "$a"           # print first element of array a
echo "${a}"         # print first element of array a
echo "${a[0]}"      # print first element of array a
echo "${a[1]}"      # print *second* element of array a
echo "${#a[@]}"     # print number of elements in array a
echo "${a[@]:1:3}"  # print 2nd through 4th elements; ie: the 3 elements
                    # starting at index 1, inclusive, so: indices 1, 2, and 3
                    # (output: `two three four`)
echo "${a[@]:1}"    # print 2nd element onward

모두 실행

위의 모든 코드 블록을 실행 파일이라는 파일에 복사하여 붙여넣고 실행할 수 있도록 array_slicing_demo.sh실행 파일로 표시합니다 . chmod +x array_slicing_demo.sh아니면 내 데모를 다운로드하세요.array_slicing_demo.sh내 파일eRCAGuy_hello_world 창고는 여기입니다.

그런 다음 다음과 같이 실행하십시오.

./array_slicing_demo.sh a b c d e f g h i j k

...다음과 같은 출력이 표시됩니다.

b c d e f
b c d e f g h i j k
new_array = d e f g h i j k
one
one
one
two
6
two three four
two three four five six

인용하다

  1. Bash: 위치 매개변수 슬라이싱
  2. Bash 변수 할당의 단일 대괄호

키워드: bash 배열 인덱스; bash 배열 슬라이싱의 배열 요소 액세스;

답변3

나는 보통 이렇게 합니다:

somefunc() {
    local message="$1"
    shift
    echo "message = $message"
    echo "other   = $@"
}
somefunc first second third goforth

그러면 다음이 인쇄됩니다:

message = first
other   = second third goforth

shift두 번째, 세 번째 등의 매개변수 뒤에 ing을 사용하여 이 개념을 확장할 수 있습니다.

답변4

함수 매개변수의 경우 답변이 echo "${@:1:2}"전혀 작동하지 않습니다. 또한 첫 번째 요소는 다른 매개변수이므로 잘라내고 싶습니다. 작동하는 것은 다음과 같습니다.

function foo(){ #takes single param + array of params
  local param1="$1".                   #first param
  local -a tmp=( "${@}" )              #copy all params
  local -a rem_params=( "${tmp[@]:1}") #slice off first:Works!
# local -a rem_params=( "${@[@]:1}"  ) #DID NOT WORK, ERROR
# local -a rem_params=( "{@:1}"      ) #DID NOT SLICE
  echo "${rem_params[@]}"
}

아마도 스크립트 수준에서 위치 매개변수가 어떻게 작동하는지 작성하고 테스트하겠지만 지금은 시간이 없습니다.

관련 정보