2010-11-25 4 views
-1

J'utilisais un script BASH rapide et sale pour automatiser un processus de partitionnement CF.
Cela a bien fonctionné jusqu'à ce que je voulais ajouter à cela.Bash EOF a un comportement inattendu

Fondamentalement, j'ai un script qui partitionne un compact flash en tant que tel:

CMD=.fdisk 
DEV=/dev/sdc 

echo "Calculating partition sizes..." 
P1SIZE=+1100M 
P2SIZE=+1200M 

echo "Creating instruction file..." 
PT1="n p 1\n $P1SIZE" 
PT2="n p 2\n $P2SIZE" 
END="a 1 w EOF\n" 

[ -e $CMD ] && rm -rf $CMD 

for i in $PT1 $PT2 $END; do echo -e $i >> $CMD; done 

echo "Creating partitions..." 
fdisk $DEV << EOF < $CMD 
[ -e $CMD ] && rm -f $CMD 

L'idée est que dans l'avenir le fichier représenté par « CMD $ » sera créé automatiquement par un outil externe avec le bonnes valeurs de début et de fin. En ce moment, j'accepte simplement le démarrage par défaut et fournissons une taille.

Cela a fonctionné assez bien jusqu'à ce que je voulais incorporer quelques étapes supplémentaires à mon script. Mais j'ai eu des problèmes quand j'ai remarqué des comportements étranges.

La première est que si j'ajouter le code ci-dessus dans une fonction, je vais continuer à obtenir une erreur de script:

line XX: syntax error: unexpected end of file 

De plus, je réalise que tout code supplémentaire après la commande fdisk ne sera pas exécuté et le script semble simplement se terminer (sans erreurs, $? = 0).

Est-ce que quelqu'un sait pourquoi la fonction ne fonctionne pas et le script se termine?

+0

Les downvoters de Drive-by sont une nuisance, mais ils se produisent; mieux s'y habituer. Si vous pensez que vous êtes attaqué (beaucoup de downvotes), contactez l'équipe ou demandez sur Meta. Et ils peuvent être un perdant, et ils peuvent être plus lâches avec leurs downvotes que vous le souhaitez, mais vous feriez mieux de les ignorer. (Triste, mais tellement.) –

Répondre

3

Vous avez démarré un heredoc (<< EOF), mais vous ne le finirez jamais nulle part.

+0

Je comprends ce que je faisais mal maintenant! Bien que j'avais la chaîne de caractères 'EOF' dans mon fichier de commandes, bash veut la trouver dans ce script spécifique et nulle part ailleurs.J'ai écrit une réponse décrivant comment le faire fonctionner dans mon cas. Merci d'avoir fait remarquer cela! – Jeach

4

Une règle de base est que la 'chaîne de limite' que vous utilisez (j'utilisais 'EOF' dans mon cas, mais vous pouvez utiliser tout ce que vous voulez) ne doit pas avoir d'espaces (ou d'onglets) devant. Si c'est le cas, cela ne sera pas considéré comme la fin.

Exemple:

myFunction() { 
    cat << EOF 
     Hello 
     World 
     EOF 
} 

Le EOF ci-dessus est considéré comme un texte normal, car il a des espaces devant elle! Si vous écrivez ce qui suit à la place:

myFunction() { 
    cat << EOF 
     Hello 
     World 
EOF 
} 

Cela va maintenant fonctionner!

Si vous insistez pour utiliser des espaces, vous pouvez supprimer les tabulations en utilisant un caractère '-' à la droite immédiate des caractères '< <'.

Exemple:

myFunction() { 
    cat <<- EOF 
     Hello 
     World 
     EOF 
} 

Notez que cela ne fonctionne que pour les onglets et non des espaces! C'est génial de garder votre code un peu plus lisible.

Notez également que si vous spécifiez la 'chaîne limite', vous finissez par désactiver la substitution de paramètre. Donc, si vous voulez écrire du texte qui ne devrait pas être substitué ou exécuté, ceci le rend possible:

cat << "EOF" 
    Type `ls -la` at the command prompt 
EOF 
+0

Wow, je pensais que je devenais fou jusqu'à ce que j'ai vu ce post. Suppression des espaces préfixant EOF résolu la fin inattendue de l'erreur de fichier pour moi. –

Questions connexes