将单个参数中的多个命令参数传递给shell函数

时间:2016-10-15 19:21:57

标签: bash shell

我想要一个执行命令的函数(例如make)和该函数的一个参数可以是多个的字符串该命令的参数。

这是一个失败的脚本示例,它演示了我想要实现的目标:

#!/bin/sh

set -e
set -u
set -v
set -x
buildSomething() {
    make ${1}
}

buildSomething "CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\" -j$(nproc)"

这会失败,因为shell决定再次引用参数:

buildSomething "CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\" -j$(nproc)"
nproc
++ nproc
+ buildSomething 'CFLAGS="-DX=1 -DY=1" CXXFLAGS="-DXX=11 -DYY=11" -j8'
+ make 'CFLAGS="-DX=1' '-DY=1"' 'CXXFLAGS="-DXX=11' '-DYY=11"' -j8
make: invalid option -- 'D'
make: invalid option -- 'Y'
make: invalid option -- '='
make: invalid option -- '1'
make: invalid option -- '"'
make: invalid option -- 'D'
make: invalid option -- 'Y'
make: invalid option -- 'Y'
make: invalid option -- '='
make: invalid option -- '1'
make: invalid option -- '1'
make: invalid option -- '"'

我知道问题在于引用,但我想我已经尝试了所有我能想到的组合......这个问题有没有通用的解决方案?我并不坚持修复上面这个确切的脚本,一个不同的方法可以让我做第一段中提到的事情也没关系。因为这样的函数会有多个命令,每个命令都可以在函数的不同参数中使用它的参数,对于一个函数中的每个命令都有多个参数非常重要参数(或等价物)。

2 个答案:

答案 0 :(得分:1)

#!/bin/sh

buildSomething() {
    eval "make ${1}"
}

buildSomething 'CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\"'" -j$(nproc)"

答案 1 :(得分:0)

我认为这可能是一种更安全的方式:

#!/bin/sh

buildSomething() {
    echo ${1} | xargs make
}

buildSomething 'CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\"'" -j$(nproc)"