将参数从文件传递到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,它将执行此操作)?
Patrick

@Patrick嗨,这是真正的重击。顺便说一句,我已经有了答案了,谢谢!
Federico Ponzi 2014年

您实际上在写source test.sh "$arguments"引号吗?这将是你的描述一个解释
格伦·杰克曼

我尝试使用双引号和不使用双引号。通过bash的替换,我总是得到单引号。因此source test.sh "$arguments"source test.sh $arguments两者都导致source test.sh 'firstargument secondargument'
Federico Ponzi 2014年

Answers:


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文件中,参数用空格分隔。顺便说一句,我尝试使用array和for进行非常类似的操作,但是没有用,也不知道为什么。好,非常感谢!
Federico Ponzi 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.