web-dev-qa-db-fra.com

Comment puis-je passer un argument de fichier à mon script bash en utilisant une commande Terminal sous Linux?

Ma question est donc comment puis-je passer un argument de fichier à mon script bash en utilisant une commande Terminal sous Linux? En ce moment, j'essaie de créer un programme en bash capable de prendre un argument de fichier du terminal et de l'utiliser comme variable dans mon programme. Par exemple, je lance myprogram --file=/path/to/file dans le terminal.

Mon programme

#!/bin/bash    
File=(the path from the argument)  
externalprogram $File (other parameters)

Comment puis-je y parvenir avec mon programme?

40
AZorin

Ce sera plus facile (et plus "propre", voir ci-dessous) si vous exécutez simplement votre script en tant que

myprogram /path/to/file

Ensuite, vous pouvez accéder au chemin dans le script en tant que $1 _ (pour l'argument n ° 1, de même $2 est l'argument n ° 2, etc.)

file="$1"
externalprogram "$file" [other parameters]

Ou juste

externalprogram "$1" [otherparameters]

Si vous voulez extraire le chemin à partir de quelque chose comme --file=/path/to/file, c'est généralement fait avec la fonction getopts Shell. Mais c’est plus compliqué que de simplement référencer $1, et d'ailleurs, des commutateurs comme --file= sont destinés à être facultatifs. Je suppose que votre script nécessite un nom de fichier à fournir, il n’a donc aucun sens de le transmettre dans un option.

55
David Z

vous pouvez utiliser getopt pour gérer les paramètres de votre script bash. Il n'y a pas beaucoup d'explications pour getopt là-bas. Voici un exemple:

#!/bin/sh

OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "$@")

if [ $? -ne 0 ]; then
  echo "getopt error"
  exit 1
fi

eval set -- $OPTIONS

while true; do
  case "$1" in
    -h|--help) HELP=1 ;;
    -f|--file) FILE="$2" ; shift ;;
    -g|--foo)  FOO=1 ;;
    -b|--bar)  BAR=1 ;;
    --)        shift ; break ;;
    *)         echo "unknown option: $1" ; exit 1 ;;
  esac
  shift
done

if [ $# -ne 0 ]; then
  echo "unknown option(s): $@"
  exit 1
fi

echo "help: $HELP"
echo "file: $FILE"
echo "foo: $FOO"
echo "bar: $BAR"

voir également:

20
lesmana

Bash prend en charge un concept appelé "Paramètres de position". Ces paramètres de position représentent des arguments spécifiés sur la ligne de commande lorsqu'un script Bash est appelé.

Les paramètres de position sont désignés par les noms $0, $1, $2 ... etc. $0 est le nom du script lui-même, $1 est le premier argument du script, $2 le second, etc. $* représente tous les paramètres de position, à l'exception de $0 (c'est-à-dire en commençant par $1).

Un exemple:

#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
12
Dan Moulding

En supposant que vous fassiez comme le suggère David Zaslavsky, de sorte que le premier argument soit simplement est le programme à exécuter (aucune analyse d'option n'est requise), vous avez affaire à la question de savoir comment passer les arguments 2 et suivants à votre programme externe. Voici un moyen pratique:

#!/bin/bash
ext_program="$1"
shift
"$ext_program" "$@"

Le shift supprimera le premier argument et renommera le reste ($2 devient $1, and so on). $ @ `fait référence aux arguments, sous forme de tableau de mots (il doit être cité!).

Si vous devez avoir votre --file _ syntaxe (par exemple, s’il ya un programme par défaut à exécuter pour que l’utilisateur ne soit pas obligé de le fournir), il suffit de remplacer ext_program="$1" avec l’analyse de $1 vous devez faire, peut-être en utilisant getopt ou getopts.

Si vous voulez lancer le vôtre, pour un cas spécifique, vous pourriez faire quelque chose comme ceci:

if [ "$#" -gt 0 -a "${1:0:6}" == "--file" ]; then
    ext_program="${1:7}"
else
    ext_program="default program"
fi
2
Cascabel