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.

Êtes-vous à l'aide de /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