Passando argumentos de um arquivo para um script bash

8

Eu tenho essa situação:

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

Dentro de myscript.sh , eu tenho que executar o arquivo test.sh , passando para ele os argumentos contidos dentro de arguments.txt .

myscript.sh é:

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

Isso funciona bem se argumentos.txt contiver no máximo um argumento:

firstargument 

A substituição é:

++ source test.sh 'firstargument'

Mas o problema é com dois ou mais argumentos. Isso é feito:

++ source test.sh 'firstargument secondargument'

Além disso, não sei antecipadamente o número de argumentos dentro de arguments.txt . Pode haver zero ou mais.

    
por Federico Ponzi 21.07.2014 / 19:35

3 respostas

6

Supondo que cada linha de arguments.txt represente um argumento separado, com o bash 4 você pode ler arguments.txt em uma matriz usando mapfile (cada linha do arquivo entra como um elemento da matriz, em seqüência) e depois passar a matriz para o comando

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

A vantagem é que a divisão em espaços incorporados dentro de linhas é evitada

Com versões inferiores do bash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"
    
por 21.07.2014 / 20:03
2

Você pode fazer isso com awk . Por exemplo:

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

Edite depois de ler seu comentário:

arguments='awk '{i = 0; while(i<=NF){i++; a = a " "$i}} END {print a}'
    
por 21.07.2014 / 21:42
1

Sugiro usar uma função com um loop while / do para percorrer o arquivo de argumentos.

Basta criar um arquivo contendo a função e, em seguida, chamar o arquivo test.sh dentro da função para iterar os argumentos contidos no arquivo 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
    
por 06.03.2015 / 02:31