将参数从文件传递到 bash 脚本

将参数从文件传递到 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。可以有零个或多个。

答案1

假设每一行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[@]}"

答案2

我建议使用带有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

答案3

您可以使用 来执行此操作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}'

相关内容