我有四个文件:
./
./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}'