다음을 포함하는 디렉토리 구조를 재구성하는 스크립트가 있습니다.
files=./*"$pattern"I{"$ifirst".."$ilast"}.ext
cp ${files} ../"$pattern"/"$i"/
스크립트를 실행하면 오류가 발생합니다.
./*S6I{001..129}.ext: No such file or directory
그러나 명령을 에코한 다음 터미널에 복사하여 붙여넣으면 예상한 동작이 나타납니다.
cp ./*S6I{001..129}.ext ../S6/1/
스크립트에서 이것이 올바르게 실행되지 않는 이유는 무엇입니까?
답변1
확장 순서로 인해 스크립트가 예상대로 작동하지 않습니다.
Bash 매뉴얼에서:
확장 순서는 중괄호 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행됨)입니다.
보시다시피 중괄호 확장이 먼저 오고 변수 확장이 마지막에 옵니다. 과제에서는 중괄호 확장이 수행되지 않습니다. 그렇지 않으면 표현식 x={1,2}
이 로 확장되며 x=1 x=2
이는 역시 의미가 없습니다.
발견한 대로 한 가지 해결책은 eval
전체 확장이 두 번 수행되므로 첫 번째 변수 확장이 두 번째 중괄호 확장 전에 수행되는 것입니다.
위험을 이해했는지 확인 eval
하고 특히 신뢰할 수 없는 입력에는 절대로 사용하지 마십시오.
Bash를 사용하면 배열을 사용할 수 있습니다.
files=( ./*"$pattern"I{"$ifirst".."$ilast"}.ext )
cp "${files[@]}" ../"$pattern"/"$i"/