Übergeben von Argumenten aus einer Datei an ein Bash-Skript

10

Ich habe diese Situation:

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

Im Inneren myscript.shmuss ich die Datei ausführen und die test.shdarin enthaltenen Argumente an sie übergeben arguments.txt.

myscript.sh ist:

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

Dies funktioniert gut, wenn argements.txt höchstens ein Argument enthält:

firstargument 

Die Substitution ist:

++ source test.sh 'firstargument'

Das Problem liegt jedoch bei zwei oder mehr Argumenten. Es macht das:

++ source test.sh 'firstargument secondargument'

Außerdem weiß ich nicht im Voraus, wie viele Argumente darin enthalten sind arguments.txt. Es kann null oder mehr geben.

Federico Ponzi
quelle
Was Sie beschreiben, ist nicht das Standardverhalten von Bash. Verwenden Sie wirklich Bash oder eine andere Shell (wie zsh, die dies tun wird)?
Patrick
@ Patrick Hallo, es ist echt Bash. Übrigens habe ich die Antwort trotzdem schon danke!
Federico Ponzi
Schreiben Sie tatsächlich source test.sh "$arguments"mit Zitaten? Das wäre eine Erklärung für Ihre Beschreibung
Glenn Jackman
Ich habe es mit und ohne doppelte Anführungszeichen versucht. Mit der Substitution der Bash bekomme ich immer das einfache Zitat. Also source test.sh "$arguments"und source test.sh $argumentsbeide führen zu source test.sh 'firstargument secondargument'.
Federico Ponzi

Antworten:

6

Angenommen, jede Zeile von arguments.txtstellt ein separates Argument dar. Mit Bash 4 können Sie arguments.txtmithilfe von mapfile(jede Zeile aus der Datei wird nacheinander als Array-Element eingefügt) in ein Array einlesen und das Array dann an den Befehl übergeben

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

Der Vorteil ist, dass das Aufteilen auf in Linien eingebetteten Räumen vermieden wird

Mit niedrigeren Versionen von Bash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"
iruvar
quelle
In der Datei arguments.txt werden die Argumente durch Leerzeichen getrennt. Übrigens habe ich etwas sehr ähnliches mit Array und a für versucht, aber nicht funktioniert und weiß nicht warum. Vielen Dank!
Federico Ponzi
2

Sie können dies mit tun awk. Zum Beispiel:

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

Bearbeiten Sie nach dem Lesen Ihres Kommentars:

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

Ich würde vorschlagen, eine Funktion mit einer while / do-Schleife zu verwenden, um die Argumentdatei zu durchlaufen.

Erstellen Sie einfach eine Datei mit der Funktion und rufen Sie dann die Datei test.sh innerhalb der Funktion auf, um die in der Datei argument.txt enthaltenen Argumente zu durchlaufen.

#!/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
quelle