Передача аргументов из файла в скрипт 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[@]}"

Внутри файла 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}'

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.