手工處理引數

當應用程式的命令列語法很簡單時,完全在自定義程式碼中執行命令引數處理是合理的。

在這個例子中,我們將介紹一系列簡單的案例研究。在每種情況下,如果引數不可接受,程式碼將產生錯誤訊息,然後呼叫 System.exit(1) 告訴 shell 命令失敗。 (我們將在每種情況下假設使用名稱為 myapp 的包裝器呼叫 Java 程式碼。)

沒有引數的命令

在本案例研究中,該命令不需要引數。該程式碼說明 args.length 為我們提供了命令列引數的數量。

public class Main {
    public static void main(String[] args) {
        if (args.length > 0) {
            System.err.println("usage: myapp");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked");
    }
}

帶有兩個引數的命令

在這個案例研究中,命令只需要兩個引數。

public class Main {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("usage: myapp <arg1> <arg2>");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked: " + args[0] + ", " + args[1]);
    }
}

請注意,如果我們忽略了檢查 args.length,如果使用者使用太少的命令列引數執行它,命令就會崩潰。

帶有 flag 選項和至少一個引數的命令

在本案例研究中,該命令有幾個(可選)標誌選項,並且在選項後至少需要一個引數。

package tommy;
public class Main {
    public static void main(String[] args) {
        boolean feelMe = false;
        boolean seeMe = false;
        int index;
        loop: for (index = 0; index < args.length; index++) {
            String opt = args[index];
            switch (opt) {
            case "-c":
               seeMe = true;
               break;
            case "-f":
               feelMe = true;
               break;
            default:
               if (!opts.isEmpty() && opts.charAt(0) == '-') {
                   error("Unknown option: '" + opt + "');
               }
               break loop;
            }
        }
        if (index >= args.length) {
            error("Missing argument(s)");
        }      
        
        // Run the application
        // ...
    }

    private static void error(String message) {
        if (message != null) {
            System.err.println(message);
        }
        System.err.println("usage: myapp [-f] [-c] [ <arg> ...]");
        System.exit(1);
   }
}

如你所見,如果命令語法複雜,處理引數和選項會相當麻煩。建議使用命令列解析庫; 看其他例子。