Passando argomenti da un file a uno script bash


10

Ho questa situazione:

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

All'interno myscript.sh, devo eseguire il file test.sh, passando ad esso gli argomenti contenuti all'interno arguments.txt.

myscript.sh è:

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

Funziona bene se if argomenti.txt contiene al massimo un argomento:

firstargument 

La sostituzione è:

++ source test.sh 'firstargument'

Ma il problema è con due o più argomenti. Lo fa:

++ source test.sh 'firstargument secondargument'

Inoltre, non conosco in anticipo il numero di argomenti all'interno arguments.txt. Possono esserci zero o più.


Quello che stai descrivendo non è il comportamento predefinito di bash. Stai veramente usando bash o qualche altra shell (come zsh, che farà questo)?
Patrick,

@Patrick Ciao, è vero bash. Comunque ho già ricevuto la risposta, grazie!
Federico Ponzi,

Stai davvero scrivendo source test.sh "$arguments"tra virgolette? Questa sarebbe una spiegazione per la tua descrizione
Glenn Jackman,

Ho provato sia con che senza virgolette doppie. Con la sostituzione di bash ottengo sempre la singola quotazione. Quindi source test.sh "$arguments"ed source test.sh $argumentsentrambi risultano source test.sh 'firstargument secondargument'.
Federico Ponzi,

Risposte:


6

Supponendo che ogni riga di arguments.txtrappresenti un argomento separato, con bash 4 è possibile leggere arguments.txtin un array usando mapfile(ogni riga del file va come un elemento di array, in sequenza) e quindi passare l'array al comando

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

Il vantaggio è che si evita la divisione in spazi incorporati all'interno di linee

Con versioni inferiori di bash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"

All'interno del file argomenti.txt gli argomenti sono separati da spazio. A proposito ho provato qualcosa di molto simile usando array e a for ma non ha funzionato e non so perché. Bene, grazie mille!
Federico Ponzi,

2

Puoi farlo con awk. Per esempio:

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

Modifica dopo aver letto il tuo commento:

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

1

Suggerirei di usare una funzione con un ciclo while / do per scorrere il file degli argomenti.

È sufficiente creare un file contenente la funzione e quindi chiamare il file test.sh all'interno della funzione per scorrere gli argomenti contenuti nel file argument.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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.