2010-10-14 18 views
0

J'essaie de dire à unix d'imprimer les arguments de ligne de commande transmis à un script Bourne Shell, mais cela ne fonctionne pas. Je reçois la valeur de x à l'instruction echo, et non l'argument de la ligne de commande à l'emplacement désiré.Argument de ligne de commande UNIX faisant référence à des problèmes

C'est ce que je veux:

abcd ./Run

a b c d

ce que je reçois:

Quoi ' s continue? Je sais que UNIX est confus selon ce que je fais référence dans le script shell (la variable x ou l'argument de ligne de commande à la position de x'th ». Comment puis-je préciser ce que je veux dire?

#!/bin/sh 
x=1 
until [ $x -gt $# ] 
do 
echo $x 
x=`expr $x + 1` 
done 

EDIT : Merci à tous pour les réponses, mais maintenant j'ai une autre question: et si vous vouliez commencer à compter non sur le premier argument, mais sur le second ou sur le troisième, que ferais-je pour dire à UNIX de traiter les éléments commençant à la deuxième position, et ignorer la première?

Répondre

1
echo $* 

$ x est l'argument Xème. Il est la variable x, et expr $x+1 est comme x ++ dans d'autres langues.

+0

Hmm ... d'accord. Mais que faire si je voulais commencer à imprimer au second argument? Donc, au lieu d'imprimer un b c d, il faudrait simplement imprimer b c d? – Waffles

1

Le plus simple changement à votre script pour faire faire ce que vous avez demandé est ceci:

#!/bin/sh 
x=1 
until [ $x -gt $# ] 
do 
    eval "echo \${$x}" 
    x=`expr $x + 1` 
done 

CEPENDANT (ce qui est un grand cependant), en utilisant eval (en particulier sur l'entrée utilisateur) est un énorme problème de sécurité. Une meilleure façon est d'utiliser changement et la première variable d'arguments de position comme ceci:

#!/bin/sh 

while [ $# -gt 0 ]; do 
    x=$1 
    shift 
    echo ${x} 
done 
+0

En tant que note ajoutée, si vous utilisez des fonctions, les arguments positionnels sont les arguments de la fonction et non les arguments du programme. Ce qui est utile, mais quelque chose à savoir. – kanaka

1

Si vous voulez commencer à compter un 2ème argument de

for i in ${@:2} 
do 
    echo $i 
done