2011-03-21 10 views
6

Quelqu'un peut-il expliquer comment tester un script shell bash?Test d'un script shell bash

Par exemple, j'ai un fichier .sh avec ce code en elle ...

#!/bin/sh 

for file in *.txt; do 
    mv "$file" "`basename $file .txt`.doc" 
done 

Comment puis-je écrire un test pour elle? Comme dans Java vous avez des tests unitaires où vous écrivez du code comme assertEquals pour tester le code donne la sortie désirée.

+0

vérifier ces -> http://stackoverflow.com/questions/1315624/bash-and-test-driven-development, http://stackoverflow.com/questions/1339416/testing-bash-scripts – Chaitanya

+0

scripts bash testés unitairement. Agréable. :) –

+0

C'est mieux: 'mv" $ fichier "" $ (basename "$ fichier" .txt) .doc "' ou 'mv" $ fichier "" $ {fichier% *. Txt} .doc "' –

Répondre

3

Je voudrais ajouter un echo devant le mv pour vérifier que les bonnes commandes sont en cours de création, pour les démarreurs. (Toujours une bonne idée avec des commandes qui rendent peut-être difficile d'annuler les modifications.)

Certains peut-être des ressources utiles:

+0

D'accord , Merci. Mais j'essaie de créer un fichier .sh qui teste tout ce code. –

+0

@Mr Teeth: ajouté quelques liens ci-dessus. Cela dit, les scripts shell sont un peu plus difficiles à tester efficacement car presque tout se résume à l'invocation de commandes externes. Il est presque plus judicieux et utile de tester ces commandes, et de tester le script lui-même en écrasant les modifications externes avec 'echo'. – geekosaur

7

Vous pouvez faire des assertions dans Bash. Découvrez ce du Guide Bash-Scripting avancée:

http://tldp.org/LDP/abs/html/debugging.html#ASSERT

+1

Veuillez ne pas encourager l'ABS en tant que référence - en règle générale, il est dénigré, et prend l'habitude de présenter des exemples de mauvaises pratiques. Le wiki Wooledge et le wiki bash-hackers (et bien sûr le manuel officiel) sont * beaucoup * de meilleures ressources. –

-1
#!/bin/sh 
for file in *.txt; do 
    echo mv "$file" "`basename $file .txt`.doc" 
done 
2

Essayez ceci: assert.sh

source "./assert.sh" 

local expected actual 
expected="Hello" 
actual="World!" 
assert_eq "$expected" "$actual" "not equivalent!" 
# => x Hello == World :: not equivalent!