2011-11-09 3 views
1

Je voudrais concaténer des chaînes ensemble pour créer une chaîne de commande dans un script csh, fichier1.csh. Cependant, csh continue de se plaindre des erreurs pour la variable commandString et je ne sais pas vraiment ce que j'ai fait de mal. Voici une partie des codes.Comment concaténer des chaînes ensemble dans csh?

set var1 = "Hat" 
set var2 = 100 
set embeddedString = 's/'$var1' =.*$/'$var1' = '$var2'/g' 
set commandString = "sed -i ' "$embeddedString" ' productPrice.txt" 
echo $commandString 

Mon objectif est de mettre CommandString vairable être quelque chose comme

sed -i 's/Hat =.*$ /Hat = 100/g' productPrice.txt 

Ensuite, ce CommandString sera inséré dans un autre fichier de script, file2.csh. file2.csh est le fichier script réel qui exécute la commande de substitution pour le prix de Hat. De plus, les valeurs de var1 et var2 sont lues à partir d'un fichier priceUpdateList.txt afin qu'elles ne soient pas des valeurs fixes. En d'autres termes, je ne peux pas simplement taper Hat et 100 dans la variable commandString. Est-ce que quelqu'un sait comment utiliser correctement la citation pour générer la chaîne de commande dans csh?

Merci beaucoup,

+0

Je ne peux pas tester cela dans mon environnement, mais vous devrez citer (au moins 1x) les guillemets simples intégrés (ie 'cmdStr =" sed -i \ '... '. $ cmdStr vous aurez besoin de 'eval' juste? Bonne chance – shellter

+0

Aussi, activez le débogage du shell (hm ... csh ...' set -vx' comme tous les autres shells?). bonne chance – shellter

+0

Merci beaucoup, avant que je ne me suicide, ça a marché. :) J'ai découvert que je pouvais mettre en place la chaîne commandString mais je ne pouvais pas en faire écho. Cependant, aussi longtemps que csh peut définir les variables, je suis satisfait – Cassie

Répondre

1

vous devez citer (au moins 1 fois) les guillemets simples intégrés (c.-à-cmdStr = "sed -i \' .... pour exécuter réellement la $ cmdStr vous aurez besoin de eval droite?

Pour utiliser le débogage shell csh (que je recommande de voir ce qui se passe), modifiez la première ligne de votre script à

#!/bin/csh -vx 

Cela vous montrera chaque ligne ou bloc de code tel qu'il est exécuté, puis le même bloc de code avec les variables d'environnement étendues.

0

que diriez-vous: ensemble embeddedString = "s, $ var1 = *, $ var1 = $ var2, g" ensemble CommandString = "sed -i '$ embeddedString' productPrice.txt »

vous pouvez utiliser/au lieu de, dans embeddedString si vous voulez :-)

+0

Je change le commandString comme mentionné. Cependant, csh s'est plaint d'écho: Aucune correspondance, il semble donc que la chaîne de commande n'est pas correctement définie. – Cassie

+0

merci beaucoup pour votre aide aussi. – Cassie

0

Excessivement simple:
Votre but est de définir la variable commandString être quelque chose comme

sed -i 's/Hat =.*$ /Hat = 100/g' productPrice.txt 

Le fait ci-dessous, et imprime commandString pour la comparaison avec votre objectif ...

De plus tous vos les citations sont inutiles sauf celles qui délimitent vos chaînes "finales".
Mais surtout, s'il vous plaît noter l'espace manquant entre .*$ and /$var1. Assez pour tromper l'interprète qui a vu une chaîne nommée $/ tandis que les noms de chaînes devraient commencer par une lettre.

set var1 = "Hat" 
set var2 = 100 
set embeddedString = "s/$var1 =.*$ /$var1 = $var2/g" 
set commandString = "sed -i $embeddedString productPrice.txt" 
echo "$commandString" 
0

Désolé j'ai oublié d'expliquer le No match cité par Cassie La différence entre

echo $commandString 

et enter code here echo "$ CommandString"

est que le premier fait écho le résultat de la commande correctement construite (Aucune correspondance bien sûr car elle doit lire un fichier absent nommé productPrice.txt, tandis que la seconde, intégrant la commande entre guillemets doubles, montre la commande elle-même, ce qui est demandé.

+0

Vous devriez éditer votre réponse précédente, pas en ajouter une nouvelle. – mata

Questions connexes