code reading 練習問題2.2

(Dave Thomasから教えをいただいた)echoプログラムでgetopt関数を使えないのはなぜか?

echo_example.c

#include <stdio.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    int nflag = 0;
    int c;
    while ((c = getopt(argc, argv, "+n")) != -1) {
    if (c == 'n')
        nflag = 1;
    }
    argv+=optind;
    while (*argv) {
    (void)printf("%s", *argv);
    if (*++argv)
        putchar(' ');
    }
    if (!nflag)
    putchar('\n');
    exit(0);
}

echoのオプションはnだけだけど、それ以外が指定された場合
エラーとするのではなく、文字列として出力される。
例えば echo -a は正しく処理され、-aと出力される。
 
つまり、getoptを利用しよとすると、これがダメなわけですね。

$ echo -a
-a

$ ./echo_example -a
./echo_example: illegal option -- a
$ echo -n
$ echo -n aaa
aaa%
$ echo aaa
aaa

$ ./echo_example -n
$ ./echo_example -n aaa
aaa%
$ ./echo_example aaa
aaa