名前のリストとバイナリファイルがあります。リストの各メンバーがコピーを持つように、このバイナリのコピーを作成したいと思います。リストはテキストファイルで、各行には名前があります。私は戻ってきます。
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
コマンドには2つの問題があります。
最初はすでに@Arkadiusz Drabczykの答えとして説明されています。
アンダースコアは変数名に有効な文字なので、変数名はアンダースコアの後に終わりません$i
。を使用する必要があります${i}
。
2番目の質問:を使用しないでください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