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.
#!/bin/bash
File=(the path from the argument)
externalprogram $File (other parameters)
Comment puis-je y parvenir avec mon programme?
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.
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:
man getopt
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>
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