Humanity

Edit the world by your favorite way

シェルスクリプトで引数をスライスして別のコマンドに渡す

以下の例ではfというシェル関数に「foo bar "sp sp sp" -- baz」という引数を与えて
「--」までの引数、つまり「foo」「bar」「sp sp sp」をgというシェル関数に渡している。

渡したい引数のそれぞれをクオートしてevalとともに関数を呼び出せば
空白を含む引数を渡されてもちゃんと動作する。

g() {
    for i in "$@"; do
        echo $i
    done

    # output:
    # foo
    # bar
    # sp sp sp
}

f() {
    g_args=

    while [ $# -ne 0 ]; do
        if [ "$1" = '--' ]; then
            shift
            break
        fi

        if [ -z "$g_args" ]; then
            g_args="'$1'"
        else
            g_args="$g_args '$1'"
        fi
        shift
    done

    eval "g $g_args"
}

f foo bar "sp sp sp" -- baz

検索用

配列