중괄호 확장을 사용할 때 bash에서 줄 바꿈과 관련된 어리석은 문제가 있습니다.
예를 들어 다음과 같은 것이 있습니다.
echo {a,b,c,d}
이제 코드를 여러 줄로 나누고 싶습니다.
echo {a,b, \
c,d}
하지만 작동하지 않습니다. 중괄호 확장을 사용하여 코드를 분할하는 정확하고 아름다운 방법은 무엇입니까? 감사해요
답변1
댓글에 따르면, 중괄호 확장은 파일 이름 목록을 저장하는 데 사용됩니다.
이는 쉘 배열에서도 수행할 수 있으며 더 간결합니다.
files=(
file1
file2
file{A..K}
some/other/file
some/directory/*.txt
'file with spaces in its name'
)
두 번째 항목의 파일 이름 glob은 일치하는 모든 이름으로 확장됩니다. 마찬가지로 중괄호 확장으로 인해 세 번째 항목은 fileA
, fileB
, ... 로 확장됩니다.fileK
그런 다음 배열을 반복하여 파일을 복사합니다.
for file in "${files[@]}"; do
cp "$file" some/destination
done
또는 (파일이 수천 개 미만인 경우)
cp "${files[@]}" some/destination
위의 인용문은 잘 생각되고 중요한 내용입니다. 그렇지 않으면 유효한 경로 이름을 모두 지원하지 못할 수도 있습니다.
답변2
예, 공백을 제거하면 됩니다.
$ echo {a..\
> z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
답변3
추가 공백을 제거하십시오.
echo X{a,b,\
c,d}Y{e,f\
,g,h}W
이것은 ↑↑↑ 작동하고 예상되는 출력을 생성합니다.
XaYeW XaYfW XaYgW XaYhW XbYeW XbYfW XbYgW XbYhW XcYeW XcYfW XcYgW XcYhW XdYeW XdYfW XdYgW XdYhW
그러나 명시적 for
루프는 (때때로) 복잡한 여러 줄 확장보다 (더 장황하긴 하지만) 읽기 쉬울 수 있습니다. 동일한 결과를 다시 출력합니다.
for x in {a..d}; do for y in {e..h}; do array+=("X${x}Y${y}W"); done; done
echo "${array[@]}"