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

У меня сложилась такая ситуация:

./ ./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 . Может быть ноль или больше.

  • Как найти все квадратные изображения в каталоге
  • Транспонирование трехмерного тензора, воспроизводимого файлами
  • Сценарий оболочки - пробелы не всегда распознаются как таковые?
  • Как заставить команду diff игнорировать некоторые строки второго файла (bash)?
  • Сценарий Bash для удаления файла с именем index.html рекурсивно
  • Извлечение справочного сообщения из самого скрипта
  • Извлечение URL из неформатированного текста
  • Shell-скрипты для разделения чисел внутри файла
  • 3 Solutions collect form web for “Передача аргументов из файла в сценарий bash”

    Предполагая, что каждая строка 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[@]}" 

    Вы можете сделать это с помощью 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}' 

    Я бы предложил использовать функцию с циклом 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 
    Linux и Unix - лучшая ОС в мире.