Passer des arguments d'un fichier à un script bash

10

J'ai cette situation:

./
./myscript.sh
./arguments.txt
./test.sh

À l'intérieur myscript.sh, je dois exécuter le fichier test.sh, en lui passant les arguments contenus à l'intérieur arguments.txt.

myscript.sh est:

arguments=$(cat arguments.txt)
source test.sh $arguments

Cela fonctionne bien si if arguments.txt contient au plus un argument:

firstargument 

La substitution est:

++ source test.sh 'firstargument'

Mais le problème vient de deux ou plusieurs arguments. Il fait ceci:

++ source test.sh 'firstargument secondargument'

De plus, je ne connais pas à l'avance le nombre d'arguments à l'intérieur arguments.txt. Il peut y en avoir zéro ou plus.

Federico Ponzi
la source
Ce que vous décrivez n'est pas le comportement par défaut de bash. Utilisez-vous vraiment bash, ou un autre shell (comme zsh, qui le fera)?
Patrick
@Patrick Salut, c'est du vrai bash. Btw j'ai déjà la réponse merci de toute façon!
Federico Ponzi
Êtes-vous en train source test.sh "$arguments"d' écrire avec des citations? Ce serait une explication pour votre description
glenn jackman
J'ai essayé à la fois avec et sans guillemets. Avec la substitution de bash, j'obtiens toujours le guillemet simple. Donc, source test.sh "$arguments"et les source test.sh $argumentsdeux aboutissent source test.sh 'firstargument secondargument'.
Federico Ponzi du

Réponses:

6

En supposant que chaque ligne de arguments.txtreprésente un argument distinct, avec bash 4, vous pouvez lire arguments.txtdans un tableau à l'aide de mapfile(chaque ligne du fichier entre en tant qu'élément de tableau, dans l'ordre), puis passer le tableau à la commande

mapfile -t <arguments.txt
source test.sh "${MAPFILE[@]}"

L'avantage est que le fractionnement sur des espaces intégrés à l'intérieur des lignes est évité

Avec les versions inférieures de bash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"
iruvar
la source
Dans le fichier arguments.txt, les arguments sont séparés par un espace. En fait, j'ai essayé quelque chose de très similaire en utilisant un tableau et un pour mais cela n'a pas fonctionné et je ne sais pas pourquoi. Merci beaucoup!
Federico Ponzi
2

Vous pouvez le faire avec awk. Par exemple:

arguments=`awk '{a = $1 " " a} END {print a}' arguments.txt`

Modifiez après avoir lu votre commentaire:

arguments=`awk '{i = 0; while(i<=NF){i++; a = a " "$i}} END {print a}'
Rhim
la source
1

Je suggérerais d'utiliser une fonction avec une boucle while / do pour parcourir le fichier d'arguments.

Créez simplement un fichier contenant la fonction, puis appelez le fichier test.sh dans la fonction pour parcourir les arguments contenus dans le fichier arguments.txt.

#!/bin/sh
# Calling script

function_name ()
  {
    while read line;
      do
        . ~/path_to/test.sh $line
         do_something_commands # print to screen or file or do nothing
      done < ~/path_to_/argument_file.txt
  }

function_name # Call the function
  do_something_commands # print to screen or file or do nothing
Carl Lindgren
la source