Передача аргументов из файла в скрипт bash

10

У меня такая ситуация:

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

Внутри myscript.shя должен запустить файл test.sh, передав ему аргументы, содержащиеся внутри arguments.txt.

myscript.sh это:

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

Это хорошо работает, если arguments.txt содержит не более одного аргумента:

firstargument 

Подстановка:

++ source test.sh 'firstargument'

Но проблема в двух или более аргументах. Это делает это:

++ source test.sh 'firstargument secondargument'

Кроме того, я не знаю заранее количество аргументов внутри arguments.txt. Там может быть ноль или более.

Федерико Понци
источник
То, что вы описываете, не является поведением bash по умолчанию. Вы действительно используете bash или какую-то другую оболочку (например, zsh, которая сделает это)?
Патрик
@ Патрик Привет, это настоящий баш. Кстати, я уже получил ответ, спасибо в любом случае!
Федерико Понци
Вы на самом деле пишете source test.sh "$arguments"с кавычками? Это было бы одно объяснение для вашего описания
Гленн Джекман
Я пробовал как с двойными кавычками, так и без них. С заменой bash я всегда получаю одинарную кавычку. Так source test.sh "$arguments"и то и source test.sh $argumentsдругое source test.sh 'firstargument secondargument'.
Федерико Понци

Ответы:

6

Предполагая, что каждая строка arguments.txtпредставляет отдельный аргумент, с помощью bash 4 вы можете прочитать arguments.txtв массив, используя mapfile(каждая строка из файла входит как элемент массива, последовательно), а затем передать массив в команду

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

Преимущество состоит в том, что разбивка на пробелы, встроенные в линии, исключается

С более низкими версиями Bash

IFS=$'\n' read -ra arr -d '' <arguments.txt
source test.sh "${arr[@]}"
Iruvar
источник
Внутри файла arguments.txt аргументы разделяются пробелом. Кстати, я пробовал что-то очень похожее, используя массив и для, но не сработало, и не знаю почему. Ну, спасибо большое!
Федерико Понци
2

Вы можете сделать это с awk. Например:

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

Изменить после прочтения вашего комментария:

arguments=`awk '{i = 0; while(i<=NF){i++; a = a " "$i}} END {print a}'
Rhim
источник
1

Я бы предложил использовать функцию с циклом while / do для итерации файла аргументов.

Просто создайте файл, содержащий функцию, а затем вызовите файл test.sh внутри функции, чтобы перебрать аргументы, содержащиеся в файле 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
Карл Линдгрен
источник