スペースを含む一連のパラメータをシェル関数に正しく渡す方法

スペースを含む一連のパラメータをシェル関数に正しく渡す方法

私の問題は、単にスペースを含む引数を渡すことではありません(その方法を知っています)。より複雑なケースを考えてみましょう。

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(引用符なし)のみを残します。

おすすめ記事