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