zsh:コマンドライン引数を2つの文字列に抽出します。

zsh:コマンドライン引数を2つの文字列に抽出します。

私のスクリプトは、必要な数のパラメータと複数のオプションを受け入れます。

すべてのオプションと最初のパラメータを文字列として抽出し、残りのパラメータを2番目の文字列として抽出する必要があります。つまり:

./script.sh foo FILE1                     [s1="foo"  s2="FILE1]"
./script.sh foo FILE1 FILE2 FILE3         [s1="foo"  s2="FILE1 FILE2 FILE3]"

./script.sh -i -l foo FILE1               [s1="-i -l foo"  s2="FILE1]"
./script.sh -i -l foo FILE1 FILE2 FILE3   [s1="-i -l foo"  s2="FILE1 FILE2 FILE3]"

$@この2つの文字列に分割するだけです。パラメータを扱う必要はありませんgetopt。つまり、 。

これを行う最も簡単な方法は何ですか?

編集する:文字列の代わりに配列の配列に抽出すると、トリックが実行されます。

ベストアンサー1

set -o extendedglob

first_set=("$@[1,(i)^-*]")
first=${(j[ ])first_set}

$first空白文字で始まらず、最初の引数まですべての引数を連結して保存されます。-

その後、$second残りを得ることができます。

second_set=("$@[$#first_set + 1, -1]")
second=${(j[ ])second_set}

とにかくこれ$@ではありません。ひも、これはゼロ個以上の文字列のリストです。

たとえば、コマンドラインを使用してBourneに似たシェルからスクリプトを呼び出すと、次のようになります。

script.sh -i   -l 'foo bar'   'File 1' File\ 2   "File 3"

これでスクリプトが実行されます。

execve("/path/to/script.sh", ["script.sh", "-i", "-l", "foo bar",
                              "File 1", "File 2", "File 3"], environ)

(スクリプトがで始まると仮定#! /bin/zsh -):

execve("/bin/zsh", ["/bin/zsh" /* or "script.sh" depending on the system*/,
                    "-", "/path/to/script.sh", "-i", "-l", "foo bar",
                    "File 1", "File 2", "File 3"], environ)

スクリプトでは、これらの文字列はすべて$@次のパラメータargv[]に含まれています。execve()/path/to/script.sh

上記では、リストを2つの部分に分けました。セット$first_setおよび$second_set配列変数)、次にこのセットのパラメータを2つのスカラー変数($firstおよび$second)に連結します。ただし、接続が完了すると、もはや元のパラメータリストに戻ることはできません。たとえば、$secondこの場合はincludeになり、File 1 File 2 File 3どの空白文字が引数を区切る文字か、どの文字が引数の一部かを区別する方法はありません。

おすすめ記事