誰かがコマンドラインにオプションを解析する標準があると言ったことがあります。それは次のとおりです。
./script.sh [options/flags] [command or file]
shift
フラグを渡すことができ、残りの項目はを介してアクセスできるので、これはシェルスクリプトを解析するときに作業をより簡単にすることを知っていますが、実際に書かれた$@ or $*
標準はありますか?
私が見たほとんどのプログラムはこの標準に従いますが、いくつかの例外があります。たとえば、、、、、ls
ともにls -l /path
許可さls /path -l
れls /path -l /path2
ます。
ベストアンサー1
POSIXの基本定義には「実用的な習慣POSIX 基本ユーティリティの場合。
基準getopts
ユーティリティ量getopt()
システムインタフェース(「C関数」)は、シェルスクリプトまたはCプログラムからコマンドラインを解析するときの指示(上記のリンクページの下)に従います。特にgetopts
(例えば):
オプションの終わりに達すると、
getopts
ユーティリティは0より大きい値で終了する必要があります。シェル変数はOPTIND
最初のオペランドのインデックスに設定する必要があり、"$#" +1
オペランドがない場合はその値をname
文字に設定する必要があります。 。次のいずれかはオプションの終わりを識別する必要があります。最初の引数--
はオプション引数ではありません。オプション引数ではなく、で始まらない引数を見つけると、-
エラーが発生します。
これが基本的に言うのは、オプションが最初に来て、その後にオペランド(「コマンドまたはファイル」)が続くことです。
他の方法でこれを行うと、役に立たないか不可能になり、getopts
コマンドgetopt()
のオプションとオペランドを指定するPOSIXメソッドに精通しているユーザーに混乱を招く可能性があります。
上記の基準はPOSIXユーティリティにのみ適用されますが、通常はUnixユーティリティの優先順位を設定します。明らかに、非標準のUnixユーティリティはそれに従うことができ、壊れるかもしれません。
たとえば、GNU coreutils は標準ユーティリティを実装しても、次のような操作を許可します。
$ ls Documents/ -l
POSIXLY_CORRECT
環境変数が設定されていない場合、同じユーティリティのBSDバージョンは設定されません。
その結果、次はBSDシステムで期待どおりに機能します(つまり、POSIXの動作が予想される場合)。
$ touch -- 'test' '-l'
$ ls -l test -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 test
しかし、GNU coreutilsシステムでは、次のようになります。
$ ls -l test -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 test
しかし:
$ env POSIXLY_CORRECT=1 ls -l test -l
そして
$ ls -l -- test -l
また、GNUシステムでは「正しい」ことをします。