배열의 항목을 사용하여 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
물론 상황에 따라서도 가능합니다.첫 번째프로젝트는 독특합니다.