2010-04-04 21 views
0

Ceci est mon premier script Bash alors pardonnez-moi si cette question est triviale. J'ai besoin de compter le nombre de fichiers dans un répertoire spécifié $ HOME/.junk. Je pensais que ce serait simple et supposais ce qui suit travaillerait:Appeler des utilitaires Linux avec des options à partir d'un script Bash

numfiles= find $HOME/.junk -type f | wc -l 
echo "There are $numfiles files in the .junk directory." 

Taper find $HOME/.junk -type f | wc -l à la ligne de commande fonctionne exactement comme je m'y attendais à, simplement retourner le nombre de fichiers. Pourquoi cela ne fonctionne-t-il pas quand il est entré dans mon script? Est-ce que je manque une notation spéciale quand il s'agit de passer des options aux utilitaires?

Merci beaucoup pour votre temps et votre aide.

+0

Notez que votre commande 'trouver' a été exécutée avec une variable d'environnement de set 'numFiles de la chaîne vide. Cela peut être utile quand vous voulez le faire (vous pouvez définir un var env pour la durée d'une commande sans affecter le shell parent), mais c'est une surprise quand vous ne savez pas que cela arrive. –

Répondre

5

Vous avez juste besoin de l'entourer avec des accents graves:

numfiles=`find $HOME/.junk -type f | wc -l` 

Le terme de c'est command substitution.

+0

Merci beaucoup! Ça fonctionne maintenant. –

+0

@Kyle: De rien. Au fur et à mesure que vous rencontrez d'autres problèmes d'apprentissage des scripts Bash (ou si vous voulez simplement apprendre à l'avance), je vous recommande fortement de lire le Guide de script Advanced Bash comme étant lié dans ma réponse. –

+0

Je vais certainement mettre ce guide à bon usage, merci encore Mark. –

4

si vous utilisez bash, vous pouvez également utiliser $() pour la substitution de commande, comme ceci:

numfiles=$(find $HOME/.junk -type f | wc -l) 

Je trouve que ce soit un peu plus lisible que backquotes, ainsi que d'avoir la capacité d'imbriquer plusieurs commandes à l'intérieur les uns des autres.

+0

Ceci est également utile, merci beaucoup! –

1

avec bash 4 (si vous voulez récursive)

#!/bin/bash 
shopt -s globstar 
for file in ** 
do 
((i++)) 
done 
echo "total files: $i" 

sinon

#!/bin/bash 
shopt -s dotglob 
shopt -s nullglob 
for file in * 
do 
    ((i++)) 
done 
echo "total files: $i" 
+0

Informations intéressantes! –