我有一个姓名列表和一个二进制文件。我想复制该二进制文件,以便列表中的每个成员都有一个副本。该列表是一个文本文件,每一行都有一个名称。我不断回来
for i in $(cat ../dir/file); do cp binaryfile.docx "$i_binaryfile.docx"; done
没有错误。仅创建一个名为 _binaryfile.docx 的文件。
我看过这个[将文件复制到具有不同名称的目的地] 和[在命令 shell 中重复文件 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