2013-02-20 3 views
2

J'essaye d'écrire un petit script shell qui fait les multiples copies d'un fichier. Je suis capable de prendre le nom du fichier en entrée mais pas le nombre de copies. Voici ce que j'ai écrit. Mais je suis incapable de passer la variable NUMBER à pour la boucle.Faire plusieurs copies de fichiers avec un script shell

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 

Répondre

3

Malheureusement, cela ne fonctionne pas comme ça. Bash performs brace expansion before parameter expansion, de sorte que votre accolade sera étendue avant que $NUMBER soit évaluée. Voir aussi le Bash Pitfall #33, ce qui explique le problème.

Une façon de faire, en utilisant votre code, serait:

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

Ou, encore plus court: (Merci, Glenn Jackman)

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


Notez que typiquement, variables should be quoted. Ceci est particulièrement important pour les noms de fichiers. Que faire si votre fichier s'appelle foo bar? Ensuite, votre cp -f copiera foo et bar car les arguments sont séparés par des espaces.

Donc, faire quelque chose comme ceci:

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

Bien qu'il n'importe si vos fichiers ne contiennent pas des espaces, citant des variables est quelque chose que vous devez faire automatiquement pour éviter des surprises à l'avenir.

+0

Merci l'homme. Je suis également à la recherche d'une référence concise pour les scripts shell pour les concepts de base. – gthm

+0

@gthmgeeky Malheureusement (à mon avis) il n'y a pas de concepts "basiques" pour les scripts Bash. Bash est très spécial quand il s'agit de faire des choses que l'on pourrait supposer être plutôt facile. Consultez le [Advanced Bash-Scripting Guide] (http://tldp.org/LDP/abs/html/) et [Greg's Bash Wiki] (http://mywiki.wooledge.org/) ainsi que le [Bash Wiki] Hackers Wiki] (http://wiki.bash-hackers.org/). – slhck

+0

Si vous voulez supprimer l'extension, ne supposez pas que le nom de fichier a un seul point: utilisez $ {FILENAME%. *} 'Au lieu de $ {FILENAME %%. *}' –

Questions connexes