私の問題は、単にスペースを含む引数を渡すことではありません(その方法を知っています)。より複雑なケースを考えてみましょう。
function build() {
make CC="$1" CFLAGS="$2" $* # $* is not correct here!
}
build gcc "XXX" VAR1="a b" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm"
等しい
make CC=gcc CFLAGS=XXX VAR1="a b" VAR2="c=A d=B" LDFLAGS="-L/opt/lib -lm"
私はこれがシェルで動作するようにしたいと思います(移植可能なソリューションを提供し、bashismなどを使用しないでください)。どのような提案や推奨事項がありますか?
答え1
より良い解決策には2つの要素があります。
shift
- (もっと見る)引用
次のように定義関数を使用しますshift
。
function build {
local cc="$1"
local cflags="$2"
shift 2
make CC="$cc" CFLAGS="$cflags" "$@"
}
最初の2つのパラメータをローカル変数に保存してから、パラメータ配列全体をさらに2だけ移動すると、参照「$ @」が拡張されます。
次に、次のように追加の引用符を使用して呼び出します。
build gcc "XXX" 'VAR1="a b" VAR2="c=A d=B"' 'LDFLAGS="-L/opt/lib -lm"'
一重引用符は、関数の追加引数を保護します。それ以外の場合、シェルは引用符を削除し、関数VAR2=c=A d=B
(引用符なし)のみを残します。