변수에 여러 경로가 포함된 경우 경로 이름의 공백을 처리하는 방법

변수에 여러 경로가 포함된 경우 경로 이름의 공백을 처리하는 방법

경로 이름의 공백 처리에 대한 대부분의 질문을 읽었지만 내 경우에는 해당 질문을 찾지 못했습니다.일부변수의 경로 이름입니다.

find두 개의 기본 경로가 제공되는 경우 필요합니다. 예를 들면 다음과 같습니다.

pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ... 

다음에서 일치하는 항목을 찾습니다.둘 다 folder1그리고 folder2.

(참고로 이 내용은쉽게 한예; 이 특별한 경우에는 두 폴더에 걸쳐 있는 -path매개변수와 함께 수정자를 사용할 수 있다는 것을 잘 알고 있습니다. folder*하지만 이 질문은 복잡성이 높아 문제를 쉽게 해결할 수 없는 상황을 다룹니다. )


이제 folder2중간에 공간이 있다고 상상해 보세요. 다음은아니요일하다:

pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ... 

문제는 \일반적으로 쉘에서 공백을 나타내기 위해 사용되지만 변수 내용을 큰따옴표로 묶으면 작동하지 않는다는 것입니다. 그러나하나각 변수에 대한 경로(작동할 수 있음), 다음 중 하나는 작동하지 않습니다.

pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ... 

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

다음 변형도 마찬가지입니다.

pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ... 

그렇다면 경로의 공백을 올바르게 처리하는 방법은 다음과 같습니다.일부경로가 변수에 포함되어 있습니까?

관련 질문: 공백이 경로와 해당 후속 항목(동일 변수 내) 사이의 구분 기호인지, 아니면 그 안에 포함된 경로 중 하나에 속하는 공백인지 여부를 확인할 수 있는 신뢰할 수 있는 방법이 있습니까?

답변1

배열을 사용하십시오 bash:

pa=("/home/user/folder1" "/home/user/fol der2")
find "${pa[@]}" -name '*xy*' ... 

논의하다

\원하는 효과가 없는지 확인하세요 .

$ pa="/home/user/folder1 /home/user/fol\ der2"
$ printf '%s\n' $pa
/home/user/folder1
/home/user/fol\
der2

정의 \에서는 pa이스케이프 문자가 아닌 문자열의 리터럴 문자가 됩니다. 개별 문자열 목록을 원하면 배열을 사용하십시오.

답변2

배열 변수를 사용하고 배열의 각 요소에 경로 값을 입력합니다. 이것이 실제로 가능하지 않은 경우에는 다음을 제외하고 다른 접근 방식을 사용하는 것입니다.공간프로젝트 구분자로 사용하세요.

p[0]="hello"
p[1]="happy"
p[2]="world"

echo "p[0]=${p[0]}, p[1]=${p[1]}, p[2]=${p[2]}"

for p in "${p[@]}"
do
    echo "p=$p."
done

등.

관련 정보