이름 목록과 이진 파일이 있습니다. 목록의 각 구성원이 복사본을 갖도록 이 바이너리의 복사본을 만들고 싶습니다. 목록은 텍스트 파일이며 각 줄에는 이름이 있습니다. 난 계속 돌아오는데
for i in $(cat ../dir/file); do cp binaryfile.docx "$i_binaryfile.docx"; done
오류가 없습니다. _binaryfile.docx라는 파일만 생성됩니다.
나는 이것을 본 적이 있다[다른 이름으로 대상에 파일 복사] 그리고[명령 셸에서 파일을 x번 반복]그러나 나는 그들이 어떻게 다른지 알 수 없습니다.
답변1
그것은해야한다:
for i in $(cat file); do cp binaryfile.docx "${i}_binaryfile.docx"; done
편집하다:
다음 예제를 사용하여 재현할 수 있습니다.
$ i=1
$ echo $i
1
$ echo $i_7
$ echo ${i}_7
1_7
요점은 _
(밑줄) 문자가 변수 이름에 나타날 수 있습니다. 다음 내용을 읽을 수 있지만 man bash
매우 기술적이고 간결한 언어로 작성되었다는 점을 명심하세요.
name A word consisting only of alphanumeric characters and underscores, and
beginning with an alphabetic character or an underscore. Also referred to
as an identifier.
나중에:
A variable is a parameter denoted by a name.
그리고:
${parameter}
The value of parameter is substituted. The braces are required when
parameter is a positional parameter with more than one digit, or when
parameter is followed by a character which is not to be interpreted as
part of its name. The parameter is a shell parameter as described above
PARAMETERS) or an array reference (Arrays).
따라서 이름이 지정된 변수가 있고 i
그 값을 옆에 인쇄하려면 변수 이름이 앞에 끝나도록 변수
_
를 둘러싸야 합니다 .{}
Bash
_
답변2
명령에 두 가지 문제가 있습니다.
첫 번째는 이미 @Arkadiusz Drabczyk의 답변으로 설명되어 있습니다.
밑줄은 변수 이름에 유효한 문자이므로 변수 이름은 밑줄 뒤에서 끝나지 않습니다 $i
. 을 사용해야 합니다 ${i}
.
두 번째 질문: 를 사용하면 안 됩니다 for line in $(cat file); ...
. 이 경우에는 효과가 있을 수 있지만 줄이 아닌 단어가 분리되므로 일반적으로 매우 나쁜 습관입니다.
다음과 같은 다른 것을 사용하는 것이 좋습니다.
xargs -a file -I{} cp binaryfile.docx "{}_binaryfile.docx"
또는
while IFS= read -r i; do
cp binaryfile.docx "${i}_binaryfile.docx"
done < file