2016-10-10 1 views
0

J'ai un tas de répertoires à traiter, donc je commence une boucle comme ceci:

foreach n (1 2 3 4 5 6 7 8) 

J'ai un tas de commandes où je copie sur quelques fichiers de différents endroits

cp file1 dir$n 
cp file2 dir$n 

mais j'ai commandes couple où le $ n est au milieu de la commande comme ceci:

cp -r dir$nstep1 dir$n 

Lorsque j'exécute cette commande, le shell se plaint de ne pas trouver la variable $ nstep1. Ce que je veux faire est d'évaluer le $ n d'abord, puis concaténer le texte autour d'elle. J'ai essayé d'utiliser `` et(), mais aucun de ces travaux. Comment faire cela dans csh?

+0

'dir $ {n} step1' - entoure le nom d'accolades. –

+0

À côté: Les scripts dans csh ne sont généralement pas considérés comme une bonne idée. Voir [Les 10 principales raisons de ne pas utiliser le shell C] (http://www.grymoire.com/Unix/CshTop10.txt), ou [la page plus récemment mise à jour de l'auteur sur le même sujet] (http: // www .grymoire.com/unix/Csh.html); ou le classique-mais-daté [Programmation CSH considéré comme dangereux] (http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/). –

+0

I c. J'ai remarqué qu'une partie de la syntaxe dans csh est un peu bizarre, et certaines choses ont pris du temps à déboguer. J'étais juste paresseux de changer mon shell par défaut quand je me connecte à ce système, mais il semble que changer mon shell pour bash vaudra la peine à long terme. –

Répondre

2

Dans ce comportement est similaire à l'égard des coquilles POSIX:

cp -r "dir${n}step1" "dir${n}" 

Les guillemets empêchent la chaîne de fractionnement et de l'expansion de glob. Pour observer ce que cela signifie, comparer les éléments suivants:

# prints "hello * cruel * world" on one line 
set n=" * cruel * " 
printf '%s\n' "hello${n}world" 

... à ceci:

# prints "hello" on one line 
# ...then a list of files in the current directory each on their own lines 
# ...then "cruel" on another line 
# ...then a list of files again 
# ... and then "world" 
set n=" * cruel * " 
printf '%s\n' hello${n}world 

Dans les cas réels, citant correct peut donc être la différence entre la suppression du fichier au nom étrange vous essayez d'opérer, et en supprimant tout le reste dans le répertoire.

+0

Les citations sont-elles nécessaires? –

+0

@TonyRuth, ... modifié pour clarifier ce point. –