변수 "-name"은 주로 "find"입니다.

변수 "-name"은 주로 "find"입니다.

-name터미널에 "기본"이라는 이름을 명시적으로 입력하는 동안 변수에 저장하고 호출하는 배열의 임의 개수의 문자열에서 명령에 대한 복합 기본 키를 생성하려고 합니다 . 매개변수 확장 No. 실행되기 전에 확장이 발생하기 때문에 확장 변수의 참조와 관련된 문제라고 생각됩니다.find\( -name ${a[0]} -or -name ${a[1]} -or -name ${a[2]} ... \)find

다음은 문자 그대로 입력되거나 변수에서 호출되는 n=2 이름의 최소 예입니다. 그냥 파이프로 연결할 수도 있지만 이 경우에는 grep모든 작업을 수행하는 편이 낫습니다 .find

$ ls
a1  a2  b1  b2  c1  c2

$ find . \( -name a\* -or -name b\* \)
./a1
./a2
./b1
./b2

$ names="\( -name a\* -or -name b\* \)"

$ printf "%s\n" "$names"
\( -name a\* -or -name b\* \)

$ find . $(printf "%q" "$names")
find: -name\: unknown primary or operator

$ find . $(printf "%s" "$names")
find: \): unknown primary or operator

$ find . $names
find: \): unknown primary or operator

$ find . "$names"
find: \( -name a\* -or -name b\* \): No such file or directory

답변1

-name, 각 -or, 각 괄호 및 각 패턴은 별도의 매개변수여야 합니다 find. 인수를 공백으로 연결하지 마십시오. 거기에서 인수 목록으로 돌아갈 수 없습니다. 인수를 구분하는 데 사용되는 공백과 인수의 일부를 어떻게 알 수 있습니까? 당신은 또한 볼 수 있습니다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

쉘이 배열(ksh, bash, zsh)을 지원하는 경우 인수 목록을 배열에 저장하십시오.

names=(\( -name a\* -or -name b\* \))
find "${names[@]}"

$1쉘이 배열을 지원하지 않는 경우 위치 매개변수( , $2, ...를 통해 액세스할 수 있는 매개변수) 로 목록을 구성할 수 있습니다 . 명백한 제한은 위치 매개변수를 다른 목적으로 사용할 수 없다는 것입니다.

set -- \( -name a\* -or -name b\* \)
find "$@"

관련 정보