2010-03-01 4 views
4

Je suis en train d'inclure cetteParamètres de ligne de commande dans Shell Script?

du -s *|awk '{ if ($1 > 3000) print }' 

dans un script shell, mais je veux l'3000. Cependant paramétrez, puisque le $1 est déjà utilisé, je ne sais pas quoi faire. Ce fut un échec total:

size=$1 
du -s *|awk '{ if ($1 > $size) print }' 

Comment puis-je passer un paramètre à la place de 3000 dans le premier script ci-dessus?

+0

'{if ($ 1> Taille $) print}' équivaut à ' $ 1> size' – ghostdog74

+0

@ ghostdog74, bien cette taille = $ 1; du -s * | awk '{$ 1> size}' ne fonctionne pas ... je ne sais pas ce que signifie votre commentaire –

+0

je veux dire dans awk, '{if ($ 1> $ size) print}' est le même que '$ 1 > taille'. voir ma réponse pour une image plus claire. – ghostdog74

Répondre

3

Les guillemets simples qui empêchent l'expansion, donc:

du -s *|awk '{ if ($1 > '"$1"') print }' 
+0

c'est une bonne réponse. pourriez-vous inclure pourquoi c'est mieux/pire/même que 'du -s * | awk '{if ($ 1>' $ 1 ') imprimer}''? –

+0

Si le premier argument contient un espace (il * ne devrait pas *, mais je préfère ne pas espérer que les choses se passent bien), omettre les guillemets doubles fera que awk ne fonctionnera pas nécessairement comme souhaité. –

3
size=$1 
du -s *|awk '{ if ($1 > '$size') print }' 
+0

c'est cool, merci! Fonctionne également avec "1 $" bien sûr. –

+0

Faites attention, car si vous passez un paramètre avec un espace, cela risque d'échouer. Cela peut bien sûr être souhaitable. –

+0

Mais en utilisant votre réponse, vous pouvez aussi juste nixer la taille $ et utiliser $ 1 où vous avez utilisé $ taille. Quelque chose ne va pas avec cette option? –

4

lors du passage des variables shell à awk, essayez d'utiliser l'option -v de awk autant que possible. Ce sera plus "propre" que d'avoir des citations autour

size="$1" 
du -s *| awk -v size="$size" '$1>size' 
+0

Les guillemets en taille = "$ 1" sont inutiles. Les affectations de variables simples (FOO = $ BAR) n'ont pas besoin de guillemets. – Idelic

+0

c'est mon habitude parfois. pas de mal à le mettre de toute façon. – ghostdog74

1

Vous pouvez définir awk des variables sur la ligne de commande:

du -s * | awk '{ if ($1 > threshold) print }' threshold=$1 
+0

Seule l'exception utilisant cette méthode est que 'threshold' n'aura pas de valeur dans BEGIN {} block. – ghostdog74

+0

intéressant, façon cool de le faire. –

+0

@ ghostdog74 qu'est-ce qui te manque sans le bloc BEGIN {}? –

Questions connexes