来自引用

时间:2015-07-08 20:41:31

标签: bash shell

我有一个包含命令行参数的文件,我希望将其传递给另一个脚本。

但是此文件包含"param 1" param2 param3等元素。

让我们使用参数test.tmp和脚本文件script.sh调用该文件。

如果我这样做:

script.sh -p `cat test.tmp` -other_params 1 2 3

script.shp之后收到:

  1. "param
  2. 1"
  3. param2
  4. param3
  5. 但我想:

    1. param 1
    2. param2
    3. param3
    4. 有什么想法吗?

      小精度:假设script.sh不可修改。解决方案必须在shell中进行。

4 个答案:

答案 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)

grepPerl正则表达式一起使用:

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(运行这些命令的位置)。