2014-04-25 7 views
2
nOption=' | awk '{total+=$1} END {print total/1024"kb"}' ' 
find . -type f -printf "%s %p/n"| sort -nr | head -n10 $nOption 

Je voudrais créer un script pour trouver le plus gros fichier du répertoire courant. Ceci est mon script, il y avait une erreur si j'utilise la variable à remplacer ....déclaration de variable de script shell unix - commande introuvable

la sortie: ./big.sh: ligne 67: + =: command not found

mais fonctionne si je n'utilise la variable:

find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}' 

la sortie est que dois-je veux: 680.021kb

Quel est le problème de mon script ??

merci

+0

Lecture [J'essaie de placer une commande dans une variable, mais les cas complexes échouent toujours!] (Http://mywiki.wooledge.org/BashFAQ/050). – chepner

Répondre

4

Single quoted strings ne peut pas contenir d'autres guillemets simples, de sorte que la commande awk est interprétée comme une commande shell à la place. Putting commands in variables est difficile, et en général, il est plus facile, plus sûre et plus lisible pour créer une fonction:

nOption() { 
    awk '{total+=$1} END {print total/1024"kb"}' 
} 
find . -type f -printf "%s %p/n"| sort -nr | head -n10 | nOption 

Pour ce cas précis, comme @chepner souligne, la question est que vous ne pouvez pas mettre des séparateurs de commande tel que | dans une chaîne, puis l'exécuter en tant que partie d'un canal (sans eval, which is evil).

+0

Bonne réponse, mais le vrai problème, même si les citations ont été faites correctement, c'est que vous ne pouvez pas mettre la syntaxe du shell dans un paramètre comme l'OP essayé. 'noption =" | awk '...' "' (avec des guillemets et des échappements dans le script 'awk' lui-même) échouerait toujours, car le' | 'serait traité comme un caractère littéral et donc juste un autre argument pour' tête » – chepner

0

Le problème est avec des citations entre guillemets, dans l'extension de variable ...
Pourquoi ne vont pas avec un one-liner? Il est un (petit) peu plus vite et plus lisse ... :-)

find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}' 

Mise à jour:
Pour rendre le script plus souple, vous pouvez faire:

dir="." 
units="1024" 
unitsstring="kb" 
find "$dir" -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/$units"$unitsstring"}' 
+0

merci. C'est parce que cela fait partie de mon script, je voudrais changer le nOption à une certaine situation. – YOHO

+0

Je vois. Mais je pense qu'il n'est pas possible d'étendre une variable ($ 1) à l'intérieur d'une variable ($ nOption). La flexibilité n'est pas obtenue en plaçant une commande dans une variable, généralement ... Vous devriez choisir les parties de votre commande (chaîne "kb", par exemple?) Qui pourraient changer dans le futur, et mettre * ces * dans les variables ... Voir ma réponse mise à jour pour voir un exemple ... Voir aussi la réponse de l0b0, c'est une approche différente ... – MarcoS