私のスクリプトは、必要な数のパラメータと複数のオプションを受け入れます。
すべてのオプションと最初のパラメータを文字列として抽出し、残りのパラメータを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
どの空白文字が引数を区切る文字か、どの文字が引数の一部かを区別する方法はありません。