3

ファイルの複数のコピーを作成する小さなシェル スクリプトを作成しようとしています。ファイル名を入力として使用できますが、コピー数は使用できません。これが私が書いたものです。NUMBERしかし、変数を for ループに渡すことができません。

echo -n "Enter filename: "
read FILENAME
echo -n "Number of copies to be made: "
read NUMBER
for i in {2..$NUMBER}
do
cp -f $FILENAME ${FILENAME%%.*}"_"$i.csv
done
4

1 に答える 1

4

残念ながら、そのようには機能しません。Bashはパラメーター展開の前にブレース展開を実行する$NUMBERため、評価される前にブレースが展開されます。問題を説明しているBash Pitfall #33も参照してください。

コードを使用してこれを行う 1 つの方法は次のとおりです。

for i in $(eval echo {2..$NUMBER})
do
# ...
done

または、さらに短く:

for i in $(seq 2 $NUMBER)
# ...

(ありがとう、グレン・ジャックマン!)


通常、変数は引用符で囲む必要があることに注意してください。これは、ファイル名の場合に特に重要です。あなたのファイルが という名前の場合はどうなりますfoo barか? 次に、引数が空白で分割されているため、andcp -fをコピーします。foobar

したがって、次のようにします。

cp -f "$FILENAME" "${FILENAME%%.*}_${i}.csv"

ファイルに空白が含まれていなくても問題はないかもしれませんが、変数の引用は、将来の驚きを防ぐために自動的に行う必要があります。

于 2013-02-20T21:28:01.033 に答える