Передача аргументов из файла в сценарий 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 . Может быть ноль или больше.

  • sudo kill: операция не разрешена через SSH
  • Сценарий оболочки не отображает последнюю строку stdout на экране без ввода пользователем
  • Как выполнять команды, последовательно эмулируя пользователя на терминале с помощью сценария оболочки
  • не удалось изменить каталог на «/ home / corey / scripts»: разрешение отклонено
  • Как составить подборку документов Markdown
  • Получить ветвь git из нескольких папок / репозиториев
  • md5 hash только первые 512 байт файла
  • Неверный код выхода awk
  • 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 
    Interesting Posts

    создание сценария в Linux-машине для научных вычислений

    Построить сумо 0.17.1 на Ubuntu 10.10

    Принудительная рысь или elinks для интерпретации пробелов и разрывов строк

    Почему все файлы обнаружены как приложение / октет-поток в nemo?

    Арки linux и Gnome tap для щелчка не работают

    Как разбить файл pcap на основе IP-адреса на RedHat

    Возможно ли подключение Wi-Fi и Ethernet к одной сети?

    Как я могу сделать мою команду более восприимчивой к системным замедлениям, чтобы использовать ее как визуальный виджет QoS на моем рабочем столе?

    Как скопировать файлы с одной машины на другую с помощью ssh

    Как разделить файл размером 6 или 7 ГБ на несколько файлов под-2 ГБ без разделения записи?

    Что означает метки =>, ==>, ===>, ====>, -, – и определенное количество пробелов после них в выводе команды make install?

    предотвращение dpkg-buildpackage с использованием / usr / bin в качестве места установки

    Замените все буквы словом «*» после определенного слова в текстовом файле

    Memcached на веб-сервере

    Как эффективно использовать 3D через удаленное соединение?

    Linux и Unix - лучшая ОС в мире.