배열을 반복하면서 마지막 항목을 확인하는 방법이 있습니까? 배열에서 찾기 명령 만들기

배열을 반복하면서 마지막 항목을 확인하는 방법이 있습니까? 배열에서 찾기 명령 만들기

배열의 항목을 사용하여 find 명령 옵션 문자열을 만들려고 하는데 배열의 마지막 항목에 다른 문자열을 추가하고 싶습니다.

EXT=(sh mkv txt)

EXT_OPTS=(-iname)

# Now build the find command from the array
for i in "${EXT[@]}"; do
    #echo $i
    EXT_OPTS+=( "*.$i" -o -iname)
done

건배

편집하다:

이제 나는 다음을 원한다:

#!/bin/bash

EXT=(sh mkv txt)

EXT_OPTS=()
# Now build the find command from the array
for i in "${EXT[@]}"; do
    EXT_OPTS+=( -o -iname "*.$i" )
done

# remove the first thing in EXT_OPTS
EXT_OPTS=( "${EXT_OPTS[@]:1}" )

# Modify to add things to ignore:

EXT_OPTS=( "${EXT_OPTS[@]:-1}" )
EXT_OPTS=( '(' "${EXT_OPTS[@]}" ')' ! '(' -iname "*sample*" -o -iname "*test*" ')' )

#echo "${EXT_OPTS[@]}"

searchResults=$(find . -type f "${EXT_OPTS[@]}")

echo "$searchResults"

나를 위해 이것을 생산합니다 :

./Find2.sh
./untitled 2.sh
./countFiles.sh
./unrar.sh
./untitled 3.sh
./untitled 4.sh
./clearRAM.sh
./bash_test.sh
./Test_Log.txt
./untitled.txt
./Find.txt
./findTestscript.sh
./untitled.sh
./unrarTest.sh
./Test.sh
./Find.sh
./Test_Log copy.txt
./untitled 5.sh
./IF2.sh

답변1

다른 순서로 옵션을 추가한 후 첫 번째 요소를 제거합니다.

EXT=(sh mkv txt)

EXT_OPTS=()
# Now build the find command from the array
for i in "${EXT[@]}"; do
    EXT_OPTS+=( -o -iname "*.$i" )
done

# remove the first thing in EXT_OPTS
EXT_OPTS=( "${EXT_OPTS[@]:1}" )

$@아무것도 사용하지 않으면 더 깔끔하게 보일 것입니다.

EXT=(sh mkv txt)

# Empty $@
set --

# Now build the find command from the array
for i in "${EXT[@]}"; do
    set -- -o -iname "*.$i"
done

# remove the first thing in $@
shift

# assign to EXT_OPTS (this would be optional, you could just use "$@" later)
EXTS_OPTS=( "$@" )

읽기가 더 어렵기 -o -iname "*.$i"때문에 중간 배열에 추가하는 것을 선호합니다 . "*.$i" -o -iname추가하여 만들 -o -iname "*.$i"수도 있습니다.$@진짜shift첫 번째 루프 -o이후의 내용을 닫는 것은 쉽습니다 .


일부 제외 사항(무시할 이름)과 결합:

extensions=( sh mkv txt )
ignore_patterns=( '*sample*' '*test*' )

include=()
# Now build the find command from the array
for ext in "${extensions[@]}"; do
    include+=( -o -iname "*.$ext" )
done

# Do the ignore list:
ignore=()
for pattern in "${ignore_patterns[@]}"; do
    ignore=( -o -iname "$pattern" )
done

# combine:
EXT_OPTS=( '(' "${include[@]:1}" ')' ! '(' "${ignore[@]:1}" ')' )

테스트 우선순위를 지정하기 위해 괄호가 추가되었습니다.

답변2

가장 쉬운 방법은 사후에 어레이를 복구하는 것입니다. 그 후에 done추가하십시오.

unset 'EXT_OPTS[-1]'
unset 'EXT_OPTS[-1]'

삭제됩니다마지막 두 값( -o-iname), 필요한 경우 다른 값을 추가하거나 간단히 바꿀 수 있습니다.

가능한약간중복 조건을 추가하는 것이 더 쉽습니다.

EXT_OPTS+=( "*.${EXT[0]}" )

실제 상황이 좀 더 복잡하다면 위의 방법을 따라 문제를 해결하면 됩니다.

답변3

배열을 반복하면서 마지막 항목을 확인하는 방법이 있습니까?

질문에 문자 그대로 대답하자면, 직접적으로 그렇게 할 수는 없을 것 같습니다. 그러나 물론 반복하는 동안 요소 수를 계산하고 배열 크기와 비교할 수 있습니다.

test=(foo bar blah qwerty)
count=${#test[@]}
n=1
for x in "${test[@]}"; do
   last=""
   if [[ $((n++)) -eq count ]]; then
        last=" (last)"            # last element, add a note about that
   fi
   printf "%s%s\n" "$x" "$last"
done

물론 상황에 따라서도 가능합니다.첫 번째프로젝트는 독특합니다.

관련 정보