
아래 세션 기록을 참조하세요.
$ 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
?
내가 이해한 바에 따르면 대체는 내부에서 처리되므로 외부 중괄호 세트 내의 문자열(예: or )은 or 와 동일하게 처리되어야 하며 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
패턴이 되고 교체는 비어 있습니다.