2009-05-26 8 views
5

Donc, fondamentalement, j'essaie de vérifier les arguments qui sont passés dans le script. S'il a trois arguments et le troisième argument est un 1, alors je veux qu'il continue. Je veux aussi continuer si elle a quatre arguments et le troisième argument est pas 1.Problème de vérification d'argument dans le script Bash

Donc, fondamentalement, je pensais que je pouvais faire ...

if ([ $# -ne 3 ] and [ "$3" -ne "2" ]) 
then 
exit 0 
fi 

Cependant, il semble que Bash ne J'ai et doit utiliser pour si, alors j'ai pensé que je pourrais utiliser imbriqué si, mais maintenant il se plaint encore. Voilà donc ce que j'ai actuellement ...

if [ $# -ne 3 ] 
then 
if [ "$3" -ne "1" ] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be left off if you want all data (Mode=1) 
" 
exit 0 

fi 
fi 
if [ $# -ne 4 ] 
then 
if [ "$3" -ne "2" ] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be left off if you want all data (Mode=1) 
" 
exit 0 

fi 
fi 

Alors, où vais-je tort? Puis-je imbriquer des instructions dans Bash? Y a-t-il une façon super-zen de faire cela que je manque complètement?

Merci pour l'aide que vous pourriez me donner.


Nouveau problème ...

Maintenant, pour une raison ou une autre, le code ne fonctionne pas du tout. Il n'y a pas d'erreurs ou quoi que ce soit, ça ne marche tout simplement pas. Il ne vérifie pas le nombre d'arguments. J'ai exécuté le script sans arguments du tout et il saute simplement comme si ce n'était même pas là.

Une partie étrange est que j'étais sûr que le code fonctionnait hier. Revenez aujourd'hui, pas tellement. Des idées sur ce qu'est le problème? (Désolé, mais je dois enlever la réponse acceptée à ce sujet.)

if [[ $# = 3 && "$3" != "1" ]] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be omitted if all data is required (Mode=1) 
" 
exit 0 

fi 

if [[ $# > 4 ]] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be omitted if all data is required (Mode=1) 
" 
exit 0 

fi 

EDIT II:

Il y a quelques choses que le shell Bash est de ne pas aimer sur ce script que je suis en train faire. Je finirai probablement par le réécrire dans un autre langage de script et faire quelques autres choses que j'ai en tête pour le projet. Merci pour l'aide dans tous les cas.

+1

quelle erreur obtenez-vous? – Glen

Répondre

19
if [ $# -ne 3 -a "$3" -ne "1" ]; then 
    exit 0 
fi 

Pour référence

-a = and 
-o = or 

Ou, vous pouvez simplement utiliser l'utilisation:

if [[ $# != 3 && "$3" != "1" ]]; then 
+0

Merci pour l'aide. Cela m'a aidé sur quelques autres scripts sur lesquels je travaillais aussi. –

2

S'il vous plaît voir:

http://bash-hackers.org/wiki/doku.php/commands/classictest#and_and_or et http://bash-hackers.org/wiki/doku.php/syntax/ccmd/conditional_expression

Puisque vous vérifiez simplement les valeurs de sortie/retour avec "si", vous devez fournir quelque chose, par ex. une commande, qui fournit des éléments significatifs basés sur vos tests. [est une telle commande, une autre possibilité est le [[mot-clé. déjà été mentionnés

Les exemples corrects réels par scragar ci-dessus, je ne veux pas simplement les répéter :)