아래 회의록을 참조하세요:
$ mkdir temp
$ cd temp/
$ touch file{1..5}
$ ls
file1 file2 file3 file4 file5
$ SRC=file; TGT=ram
$ for f in file* ; do mv $f ${f/$SRC/$TGT} ; done
$ ls
ram1 ram2 ram3 ram4 ram5
$ PAT=ram/file
$ for f in ram* ; do mv $f ${f/$PAT} ; done
mv: 'ram1' and 'ram1' are the same file
mv: 'ram2' and 'ram2' are the same file
mv: 'ram3' and 'ram3' are the same file
mv: 'ram4' and 'ram4' are the same file
mv: 'ram5' and 'ram5' are the same file
SRC
및를 별도의 변수로 제공하면 패턴 대체가 작동 TGT
하지만 단일 변수로 제공하면 패턴 대체가 작동하지 않는 이유는 무엇입니까 PAT
?
내가 이해한 바에 따르면 대체는 안쪽에서 바깥쪽으로 처리되므로 외부 중괄호 안의 문자열은 f/$SRC/$TGT
또는 와 f/$PAT
동일하게 처리된 다음 다시 처리되어 실제 새 파일 이름을 제공해야 합니다. 하지만 분명히 이건 그렇지 않았어...f/file/ram
f/ram/file
최신 업데이트가 포함된 Kubuntu Bionic LTS에서 Bash 4.4.18을 사용하고 있습니다.
답변1
~에서배쉬 매뉴얼:
${parameter/pattern/string}
pattern
파일 이름 확장과 마찬가지로 패턴을 생성하기 위해 확장됩니다 . [...]string
null 인 경우pattern
일치 항목이 제거되며/
다음 패턴을 생략할 수 있습니다.
따라서 확장 후 패턴을 식별하고 교체하는 과정이 아닙니다. 대신 먼저 패턴을 파악하고 부품을 교체한 다음그 다음에확장되었습니다. 에서는 ${f/$PAT}
전체가 $PAT
패턴이 되고 아무것도 대체되지 않는다.