#!/bin/bash
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path
find $path -type f $open -name $pat $close
위 코드는 find의 출력을 표시하지 않습니다. 돕다
답변1
pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close
이는 원하는 효과를 갖지 않습니다. 변수의 따옴표는 pat
따옴표로 처리되지 않고 리터럴 문자로 처리됩니다. 확장 후에는 단어 $pat
분할이 수행되어 단어 '*.ab'
, -o
및 작은따옴표가 그대로 유지됩니다. 따라서 파일 이름에 작은따옴표가 포함되어 있지 않으면 일치하지 않습니다.-name
'*.bc'
path=path
이는 변수를 path
리터럴 string 으로 설정 path
하지만 이는 단지 자리 표시자일 뿐이라고 생각합니다.
open="\("
close="\)"
이는 변수에 리터럴 백슬래시를 넣고 find
인수를 받으면 불평할 수 있습니다 \(
. 괄호를 한 번만 인용하면 충분합니다 open="("
.open=\(
표현식 목록을 작성해야 하는 경우 find
배열이 있는 쉘을 사용하십시오(Bash 또는 일반 이외의 거의 모든 것 sh
).
args=()
args+=( -name "*.ab" )
args+=( -or -name "*.bc" )
find ... \( "${args[@]}" \)
필요에 따라 배열 구성을 루프로 래핑합니다.
답변2
잘못된 유형의 변수를 사용했고 이를 참조하는 것을 잊어버렸습니다.
여기에는 여러 매개변수를 저장하기 위한 배열이 필요합니다.
#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path
find "$path" -type f "$open" -name "${pat[@]}" "$close"
*.ab
OR이 아닌 AND 매개변수를 전달한다는 점에 유의하세요 . 이러한 따옴표와 백슬래시는 쉘 구문의 일부입니다.(
find
'*.ab'
\(
eval
예를 들어 이를 평가하기 위해 쉘 명령줄을 빌드하려는 경우 에만 이 작업을 수행합니다.
#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path
eval 'find "$path" -type f '"$open -name $pat $close"
그런 다음 쉘이 평가를 수행하도록 하십시오.
find "$path" -type f \( -name '*.ab' -o -name '*.bc \)
위에서 언급한 대로 find
다음 매개변수를 사용하여 호출이 발생합니다.
find
path
(콘텐츠$path
)-type
f
(
*.ab
-o
-name
*.bc
)
답변3
변수를 사용하는 대신 간단한 접근 방식을 사용하십시오.
find $path -type f -name "*.ab" -o \( -name "*.bc" \)