我有一个包含命令行参数的文件,我希望将其传递给另一个脚本。
但是此文件包含"param 1" param2 param3
等元素。
让我们使用参数test.tmp
和脚本文件script.sh
调用该文件。
如果我这样做:
script.sh -p `cat test.tmp` -other_params 1 2 3
script.sh
在p
之后收到:
"param
1"
param2
param3
但我想:
param 1
param2
param3
有什么想法吗?
小精度:假设script.sh
不可修改。解决方案必须在shell中进行。
答案 0 :(得分:6)
假设: test.tmp
需要使用此方法每行包含一个参数。
您可以将xargs与换行符分隔符一起使用:
cat test.tmp | xargs -d '\n' script.sh -p
答案 1 :(得分:6)
您可以将命令包装在eval
:
eval "script.sh -p `cat test.tmp` -other_params 1 2 3"
$ cat test.tmp
"params 1" param2 param3
$ cat script.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
$ eval "./script.sh -p `cat test.tmp` other_params 1 2 3"
-p
params 1
param2
param3
other_params
1
答案 2 :(得分:2)
像这样布置你的文件:
param 1
param2
param3
然后把它读成这样的数组:
mapfile -t params < file
然后像这样调用你的脚本:
script.sh -p "${params[@]}" -other_params 1 2 3
这种方法的优点是它只使用内置的bash命令,并且不需要eval
。
要在一行中完成所有操作,您可以使用:
mapfile -t params < file && script.sh -p "${params[@]}" -other_params 1 2 3
即。如果第一个命令成功,则使用&&
执行第二个命令。
答案 3 :(得分:1)
将grep
与Perl
正则表达式一起使用:
IFS=$'\n'; ./script.sh -p $(grep -woP '((?<=")[^"]*(?="))|([\S]+)' test.tmp)
示例:强>
script.sh:
#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"
...
输出:
-p
param 1
param2
param3
...
注意:它将更改当前shell的IFS
(运行这些命令的位置)。