2016-11-25 7 views
0

私はこれら2つの関数をbashスクリプトに持っています。私はただ一つの関数から別の関数にグローバル変数を使わずに直接引数を渡そうとしていますが、それはできないようです。グローバル変数のないbash関数間での配列/リストの受け渡し

function suman { 

    NODE_EXEC_ARGS= "--inspect"; 
    __handle_global_suman "${NODE_EXEC_ARGS}" "[email protected]" 

} 


function __handle_global_suman { 

    # I want $1 to be node exec args and $2 to be args to node script 
    node $1 ${Z}/cli.js $2; 

} 

私はを持っています問題:$1$2ため__handle_global_suman機能では、 値がsuman関数に渡された元の引数、ない__handle_global_sumanに渡される引数を表すように見えます!私は引数を__handle_global_suman関数に渡すことができるようにしたい。

一つの解決策は、以下のようなグローバル変数を使用することである(しかし、これは一般的に悪いプログラミングです):

NODE_EXEC_ARGS=""; // default 
ORIGINAL_ARGS=""; // default 

function suman { 

    NODE_EXEC_ARGS="--inspect"; 
    ORIGINAL_ARGS="[email protected]"; // assume this captures the arguments passed to this function, not the original script... 
    __handle_global_suman 
} 

# ideally there would be a way to make this function truly private 
function __handle_global_suman { 

    # I want $1 to be node exec args and $2 to be args to node script 
    node ${NODE_EXEC_ARGS} ${Z}/cli.js ${ORIGINAL_ARGS}; 

} 

がうまくいけば、あなたはあなたの私がしようとしているものを見ると助けることができ、感謝

+0

また、__handle_global_suman関数を本当にプライベートにする方法があれば、それはうまくいくでしょう。 –

+2

引数境界情報を失うことなく配列に文字列を割り当てることはできません。 'ORIGINAL_ARGS =" $ @ "'は本質的に壊れています - 文字列ではなく配列だけがその値を安全に保存できます。歩行者の引用符の誤りについては、http://shellcheck.net/を参照してください。 –

+0

...ここには多目的な悪い練習もあります。'function'キーワードはベースラインのPOSIX shシェルと不必要に互換性があります(ほとんどのbash拡張とは異なり、移植可能な形式の上に値を追加しません。これはsuman(){'と 'function'の前にありません)、すべて大文字の変数名はオペレーティングシステムやシェルにとって意味のある変数に対して、POSIX指定の規則によって予約されています。 –

答えて

2

以下では、我々は参照することにより、ローカル変数に保存されている引数リストを渡している:

suman() { 
    local -a args=(--inspect --debug-brk) 
    __handle_global_suman args "[email protected]" 
} 

__handle_global_suman() { 
    local ref="$1[@]"; shift 
    node "${!ref}" "${Z}/cli.js" "[email protected]" 
} 

なぜこれは違うの?

local -a args=(--inspect --argument-with-spaces="hello cruel world") 

を...、それは--argument-with-spaces=...は、1つの引数として、正しく渡されます:私たちも渡すことができますので。

+0

、ローカルはスムンから__handle_global_sumanにどのように渡されますか? –

+0

ああ、私はそこにargsの名前を参照してください –

+0

そのローカルキーワードが関数のために働いていたら、それはきちんとしているだろう、私たちはプライベート関数を作ることができますか? –

1

説明は少し不明ですが、私は要点を得ると思います。ワード分割はあなたがバッシュで期待したように機能していません。

あなたは以来、それが取り除かと文句を言わないという関数にパラメータを形成することになる空白である場合には、あなたに第2の機能を$ {NODE_EXEC_ARGS}パラメータを引用する必要があります。

また
__handle_global_suman "${NODE_EXEC_ARGS}" ${ORIGINAL_ARGS} 

$ {ORIGINAL_ARGS} varはあなたの例では冗長です。あなたは、直接「@ $」を渡す必要があります。

__handle_global_suman "${NODE_EXEC_ARGS}" "[email protected]" 

秒提案代替ソリューション間違いは間違いなく悪い習慣であり、あなたは間違いなくあなたはbashの関数パラメータを渡すと欲しいものを達成することができ、必要ではありません。

+0

私は引数を引用すると、正しく__handle_global_suman関数に渡されますか? –

+0

これは本当に私のために働いていない、あなたは私に元の質問で明確ではないことを教えてくれますか?私は、グローバル変数を使わずにある関数から別の関数に直接引数を渡そうとしています –

+0

まあ、私はあなたが持っている問題を正確に分離するためにそれを取り除くことができたことを意味しました。 "スーダン"のようなものですが、私は一般的なジストを取得します。あなたは単語分割問題にぶつかります。 – spinkus

0

help @ S.Pinkusさんのおかげで私はうまくいきました。回答に含まれている情報はすべて私が問題を解決するために必要だったので、アップアップしました。以下の動作に注意してください。しかし、@ CDhuffyの答えはより一般的であり、したがってより良いです。

function suman { 

    __handle_global_suman "--inspect --debug-brk" "[email protected]" 

} 

function __handle_global_suman { 

    # ${1} is "--inspect --debug-brk" 
    # ${2} is whatever I passed to the suman function 
    node ${1} ${Z}/cli.js ${2}; 

} 

bashが素晴らしいです;)...ではない

+0

このコードはバグです。 '--inspect --debug-brk'の代わりに' --foo = "bar baz" 'を渡したいのであれば、[BashFAQ#50](http:// mywiki。 wooledge.org/BashFAQ/050)。 –

+0

私は、あなたは修正を言及できますか? –

+0

bashの特定のバージョンはどれですか?あなたが4.4以上をターゲットにしているなら、ネームヴァールを使用するように誘惑されるでしょう。 –

関連する問題