2016-10-19 7 views
0

私は$1$2でいくつかのことをする必要があるスクリプトを持っています、そして、それが存在する場合、それに送られた残りの引数を実行する必要があります。現在、私はこれをやろうとしています:スクリプトに送られた引数リストを短くして、残りの短縮リストを評価するにはどうすればよいですか?

if [ ! -z "$3" ]; then 
    ${@:3} 
    eval [email protected] 
    fi 

しかしこれは動作していません。どのようにして目的の動作を達成できますか?

さらに明確にするために、$ 1はファイル、$ 2は別のスクリプト、$ @は別のスクリプトの後にその最終スクリプトの引数が続くようにする必要があります。

+0

引数は何を表していますか?それらはコマンド名か、コマンド名とそれらのコマンドの引数の組み合わせですか? 'eval'を使うことはほとんど間違った方法です。あなたのスクリプトがどのように呼び出されているか、引数とは何をすべきかの具体的な例を教えてください。 – chepner

+0

'eval'の前に' shift 2'を使います。 – hidefromkgb

+0

@chepner OPへの説明の一部を編集しました。現在提案されているシフト方法を試してみる/ – FutureShocked

答えて

2

テストを。位置パラメータの数をテストするには、$#を使用します。例えば、残りの引数で「何かを」する方法

if test $# -gt 2; then 
# ... 
fi 

は、あなたが実際に何をしたいかに大きく依存しますが、(追加の)単語分割が施され、これらのパラメータを避けるために、あなたは[email protected]を拡大したいと思います二重引用符で囲みます。 @chepnerは彼のコメントで観察として、あなたは三から始まる位置パラメータを取得する代わりに、この拡張を使用することによってたい場合たとえば、

# shift off the first two positional parameters 
shift 2 

# execute the remaining parameters as a command, with each parameter as 
# one word 
"[email protected]" 

は、あなたがshiftをスキップすることができます

​​

だことあなたがスキップしたい最初の2つのパラメータであることが分かっていれば、より明確でより簡潔になるかもしれませんが、shiftは、オプションのコンポーネントを含んでいる可能性のあるパラメータリストを噛んで避けるなど、トラッキングするか、変数インデックスをパラメータリストに使用します。

+2

「シフト」さえ厳密には必要ではありません。 '$ {@:3}' 'は最初の2つの引数をスキップし、引数3と引数が実際には設定されていない場合は何も行いません。ありがとう、@chepner; – chepner

+0

私はこれを私の答えに加え、そのフォームを使って 'shift'を使って解説しました。 –

+0

$ {@:3}は引数3を実行する必要があります。なぜ私はOPに投稿したセグメントでこれが起こっていなかったのですか? – FutureShocked

2

あなたは最初の2つの引数を処理した後$1$2を取り除くためにshiftを使用することができます。$3はない、それが存在するかどうかをテストなど、すべて同じものであるゼロでない長さを有しているかどうかを

# discard first 2 arguments 
shift 2 

# now handle remaining aguments if they exist 
(($#)) && "[email protected]" 
関連する問題