2012-10-31 17 views
5

Ho problemi a fare qualcosa di base con csh. Ho una stringa:Csh che aggiunge stringhe a un array, problemi di spazio vuoto

set newCmd = "$expansionCmd –option1 –option2 …" 

E Sto creando una matrice di queste stringhe, che in seguito desidera eseguire:

set expansionCmdList = ($expansionCmdList[*] "$newCmd") 
#I also tried without quotes, e.g. just $newCmd 

Infine cerco di iterare ed eseguire questi comandi:

Tuttavia, il problema è che le voci dell'array non sono la stringa intera, ma ogni parte della stringa è separata da spazi, ovvero la prima voce è solo "$ expansionCmd", la voce successiva sarebbe b e "-opzione1" ecc.

Mi scuso in anticipo per l'utilizzo di c shell, il codice base della mia azienda è bloccato con esso.

risposta

7

Ogni volta che si espande un intero array e si desidera mantenere intatte le identità dei singoli elementi, è necessario il modificatore :q nell'espansione. Altrimenti, non appena fai qualcosa come set expansionCmdList=($expansionCmdList[*] "$newCmd"), tutti i comandi precedenti nella lista sono suddivisi nelle loro parole componente, ognuna delle quali è ora il proprio elemento di matrice. Semplice dimostrazione:

% set a = (a "b c" d) 
% echo $a[2] 
b c 
% set a = ($a[*] e) 
% echo $a[2] 
b 

Oops, hai incasinato l'array prima ancora di arrivare al tuo ciclo di esecuzione. Le cose vanno molto meglio con :q:

% set a = (a "b c" d) 
% set a = ($a:q e) 
% echo $a[2] 
b c 

è necessario utilizzare lo stesso modificatore nel ciclo for:

foreach exCmd ($expansionCmdList:q) 

Infine, `` exCmd tenta di eseguire un comando letteralmente chiamato "exCmd". Quello che vuoi fare è eseguire il valore della variabile. Probabilmente incontrerai più problemi con gli spazi bianchi e non potrai risolverli rendendo ogni comando un array dato che csh non supporta matrici di array. Giusto avvertimento. Ma se i comandi non hanno alcun bisogno di quotazione, questo funzionerà: soluzione

$exCmd 
+1

grazie uomo ... Giuro l'unica documentazione che posso trovare su C shell è persone che dicono di non usare c shell. – JDS

+1

Bene, l'unica ragione significativa rimanente per non usare csh per lo scripting è che csh non è un ottimo linguaggio di scripting ... a causa di cose come il fatto che devi trasformare gli alias in nodi per avere qualsiasi tipo di capacità di sottoprogramma . Ma se è quello che hai, è quello che hai. E aveva array e aritmetica incorporata molto prima delle shell POSIX. :) –

+0

Si noti che l'uso di '$ {array}: q' non funzionerà - deve essere' $ arr: q'. –

0

di Marco è chiaramente superiore per la maggior parte delle applicazioni, ma c'è un'altra opzione. Invece di usare direttamente foreach, ottenere la dimensione della matrice e scorrere la sequenza:

set BUILD_MATRIX = ("makefile.make:make --jobs --makefile=makefile.make" \ 
        "Makefile:make --jobs --makefile=Makefile" \ 
        "build.xml:ant") 

foreach i (`seq ${#BUILD_MATRIX}`) 
    echo $i 
    echo $BUILD_MATRIX[$i] 
end 

(copiato da Accessing array elements with spaces in TCSH)