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.