Faire des scripts Bash exit et imprimer le message d'erreur si les utilisateurs invoquer le script mal
Script nécessaire a été
#!/bin/bash
# Check if there are two arguments
if [ $# -eq 2 ]; then
# Check if the input file actually exists.
if ! [[ -f "$1" ]]; then
echo "The input file $1 does not exist."
exit 1
fi
else
echo "Usage: $0 [inputfile] [outputfile]"
exit 1
fi
# Run the command on the input file
grep -P "^[\s]*[0-9A-Za-z-]+.?[\s]*$" "$1" > "$2"
Modifier, le script a changé de
grep -P "^[\s]*[0-9A-Za-z-]+.?[\s]*$" $*
if [ ! -f "$1" ]; then
echo 'Usage: '
echo
echo './Scriptname inputfile > outputfile'
exit 0
fi
invoquer le script sans paramètre donne pas d'erreurs et siège vide
Usage:
./Scriptname inputfile > outputfile
J'ai peu de code
grep -P "^[\s]*[0-9A-Za-z-]+.?[\s]*$" $*
Ce code tire lignes qui ont un seul mot sur eux et les pompes de la sortie d'un nouveau fichier, par exemple
This is a multi word line this the above line is not now once again wrong
La sortie serait
This
now
Le code fonctionne, les utilisateurs invoquer le code à l'aide de ./scriptname file > newfile
Cependant, je suis en train de développer du code pour donner aux utilisateurs un message d'erreur si ils invoquer le script de manière incorrecte.
Pour l'erreur messange, je suis en train de penser en écho à quelque chose en retour comme scriptname file_to_process > output_file
.
Je l'ai fait essayer
if [incorrectly invoted unsure what to type]
echo $usage
exit 1
Usage="usage [inputfile] [>] [outputfile]
Cependant, j'ai eu peu de chance. Le code fonctionne, mais ne fait rien si j'invoque avec juste le nom du script. Aussi, si j'ai appeler le script avec juste la scriptname et le fichier d'entrée, il va afficher les résultats au lieu de sortir avec le message d'erreur.
Autres ceux que j'ai essayé sont
if [ ! -n $1 ]; then
echo 'Usage: '
echo
echo './Scriptname inputfile > outputfile'
exit 0
fi
Donné les réponses que j'ai reçues jusqu'à présent, mon code est maintenant
#!/bin/bash
grep -P "^[\s]*[0-9A-Za-z-]+.?[\s]*$" $*
if [ ! -f "$1" ]; then
echo 'Usage: '
echo
echo './Scriptname inputfile > outputfile'
exit 0
fi
Lors de l'appel du script sans un fichier d'entrée, le script ne fait rien et doit être interrompue avec les touches ctrl+c, en essayant toujours de trouver l'écho de l'appel de message.
/bin/bash
ou /bin/sh
?Je suis en utilisant bin/bash
Utilisation
"$@"
plutôt que $*
sur la ligne de commande; qui préserve les espaces dans le nom de fichier arguments contenant des espaces. Si vous utilisez grep -P -e "...your regex..."
avec le -e
précédant l'expression, alors les utilisateurs peuvent taper des choses comme -n
ou -l
comme une option sur la ligne de commande, et grep
va modifier son comportement de manière appropriée. (Sur les systèmes GNU getopt()
est utilisé pour permuter des arguments, vous ne pouvez pas besoin de spécifier -e
; je ne suis pas vif sur cette fonctionnalité.)Ok thnaks pour que je vais changer le $@ maintenant
Au lieu de
[ ! -n $1 ]
utilisation [ -z "$1" ]
. Aussi mettre le grep après le nombre de paramètre de test, pas avant. Si c'est avant, et il n'y a pas de paramètre, il s'assis là à vous attendre pour le type d'entrée sur l'entrée standard. À l'expérience, essayez grep x
à la ligne de commande, sans un nom de fichier et le type en quelques lignes avec et sans x, ^D pour quitter.OriginalL'auteur Ausghostdog | 2012-10-19
Vous devez vous connecter pour publier un commentaire.
Lorsque vous exécutez le script comme
./scriptname file > newfile
, le shell interprètefile
que le seul argument de./scriptname
. C'est parce que>
est la sortie standard de l'opérateur de redirection.Je voudrais proposer 2 options possibles:
Alternative 1:
Peut-être que vous pouvez essayer de passer comme 1er argument de ce genre?
Dans ce cas un moyen de vérifier le format serait
Note: Si vous êtes de vérifier si les arguments sont valables ou pas, il est généralement préférable d'exécuter les commandes qu'après la vérification se fait.
La variante 2:
De passage 2 arguments comme
Le script ressemble à ceci
Usage: $0 [inputfile] [>] [outputfile]
donc, je voudrais juste besoin d'ajouter un autre après la finale fi gratuite et d'une sortie 0-il correct?Le script sera exécuté
grep
et sigrep
s'exécute avec succès, le script se terminera avec l'état 0, de sorte que vous n'avez pas besoin deexit 0
dans le script (si je suis la compréhension de ce que vous dites...)OriginalL'auteur doubleDown
J'utiliserais paramètre d'extension pour cela:
Si le script est appelé sans arguments (c'est à dire
$1
est pas défini) le${var:?error message}
expansion provoque le shell affiche une erreur avec le message donné et de sortie. Sinon le premier argument est assigné à la$inputfile
.Semble aussi, vous pouvez découper le message d'erreur sur les lignes dans votre script, et la sortie sera le même des sauts de lignes, si vous avez besoin de formater l'Utilisation plus clairement
OriginalL'auteur Ansgar Wiechers
Essayez d'ajouter des guillemets autour de
$1
et l'utilisation-f
pour vérifier existe et est un fichier normal:grep -P "^[\s]*[0-9A-Za-z-]+.?[\s]*$" $* if [ ! -f "$1" ]; then echo 'Usage: ' echo echo './Scriptname inputfile > outputfile' exit 0 fi
Le code quand je l'ai appelé il juste assis là un n'a rien fait, j'ai essayé invoquant avec juste le nom du script, ai-je raté quelque chose en utilisant le code.OriginalL'auteur Alvin Wong
Aussi, vous pouvez vérifier les param comptent
$#
etcat
un message d'utilisation:[ ! $# -eq 1 ]
utilisation[ $# -ne 1 ]
OriginalL'auteur higuaro