将多个参数解析为 bash 脚本

将多个参数解析为 bash 脚本

我已经尝试了这里发布的一些解决方案,但没有效果。我希望这是我错过的一些愚蠢而明显的事情,你可以很容易地发现,而我也可以捂脸。

我有一个 bash 脚本,其中包含多个用于数据分析的命令。如果我要在命令行上运行此脚本,它将看起来像这样(简化):

./script.sh /path/to/file1.gz /path/to/file2.gz output_name

script.sh我的前两个参数是数据分析命令中所需文件的路径。正如output_name您所期望的, , 是最后输出的文件的名称。

这工作正常,但我想要一个包含多个文件路径的文件,每个文件在一个新行上,并循环文件中的每一行并按顺序运行脚本。所以参数文件看起来像:

/path/to/file1.gz /path/to/file2.gz output_name1

在每一行上。

然后在 while 循环中将每一行输入到脚本中(我认为这是最好的)。

我试过:

while read -r line; do; ./script.sh; done < arg_list.txt

其中 arg_list.txt 是包含输入参数列表的文件,我得到“无法打开文件‘’”。

请随意告诉我我很愚蠢并且错过了一些东西!

答案1

使用您自己的结构,每行读入三个空格分隔的值,并将它们用作脚本的参数

while read -r in1 in2 out
do
    ./script.sh "$in1" "$in2" "$out"
done < arg_list.txt

答案2

假设输入文件的内容被正确引用(在任何参数包含空格、制表符或换行符的情况下),那么您可以xargs像这样使用:

xargs -n 3 ./script.sh <arg_list.txt

这一次从输入中读取三个参数并用它们调用您的脚本。

一组三个参数不需要列在输入文件的同一行上,xargs将读取三个参数并使用它们调用脚本,无论它们是在同一行上还是分布在两行或三行上。

示例(使用printf命令代替脚本):

$ cat file
/path/to/file1.gz /path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
'/path/to/file 1.gz' /path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
/path/to/file1.gz
/path/to/file2.gz output_name1
/path/to/file1.gz /path/to/file2.gz output_name1
$ xargs -n 3 printf 'Arg1: "%s", Arg2: "%s", Arg3: "%s"\n' <file
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file 1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"
Arg1: "/path/to/file1.gz", Arg2: "/path/to/file2.gz", Arg3: "output_name1"

答案3

实际上,如果您的文件包含确切的参数列表,那么循环就会变得非常简单:

while read
do
   ./script.sh $REPLY
done

REPLY变量是一个自动变量,如果您不向read.也不REPLY会将行拆分为字段,因此可以按原样使用。请注意这种情况下没有引号。如果从文件中读取的行包含空格和引号 - 它们将与文件中的内容完全相同地传输到命令。因此,如果文件中有一行,a b "c d"您将得到对脚本的调用,即script.sh a b "c d"三个参数,最后一个参数中有一个空格。因此,您必须确保文件内正确引用。

如果您从文件中读取的参数需要以某种方式更新,那么您可以做更详细的操作read

while read f1 f2 f3
do
   ./script.sh "$f2" "$f1" "$f3.txt"
done

在这种情况下也请注意文件中的引用。对于同一行a b "c d",此代码将生成script.sh b a "c d".txt.这可能并不完全是期望的结果。

如果带有参数的文件包含由不寻常的内容分隔的字段,那么您可以IFS在之前修改一个特殊变量read- 然后read将按 的值分割该行IFS

如果您需要更复杂的东西,您可以使用xargs, awk,甚至使用完整的语言,例如perlpython。有很多解决方案。

相关内容