Swiftのコマンドライン引数にどのようにアクセスしますか?


回答:


7

AppleはArgumentParserこれを行うためのライブラリをリリースしました:

ArgumentParser新しいオープンソースライブラリを簡単に、しかも楽しくすることができることをお知らせいたします。— Swiftでコマンドライン引数を解析します。

https://swift.org/blog/argument-parser/


Swift引数パーサー

https://github.com/apple/swift-argument-parser

コマンドラインから収集する必要がある情報を定義するタイプを宣言することから始めます。格納されている各プロパティをいずれかArgumentParserのプロパティラッパーで装飾し、への適合を宣言しParsableCommandます。

ArgumentParserライブラリは、コマンドライン引数を解析し、あなたのコマンドタイプをインスタンス化して、いずれかのカスタム実行run()に有用Aメッセージとメソッドまたは終了を。


305

更新01/17/17: Swift 3の例を更新しました。Process名前はに変更されましたCommandLine


2015年9月30日更新 Swift 2で機能するように例を更新しました。


Foundation または C_ARGV and なしでこれを行うことは実際に可能C_ARGCです。

Swift標準ライブラリには、と呼ばれるのCommandLineコレクションを持つ構造体が含まれています。したがって、次のように引数をオンにすることができます。Stringarguments

for argument in CommandLine.arguments {
    switch argument {
    case "arg1":
        print("first argument")

    case "arg2":
        print("second argument")

    default:
        print("an argument")
    }
}

10
@AlbinStigo Process.argumentsはすでに文字列の配列なので、新しく作成する必要はありません。
ランス

9
ほとんどの場合、最良の答えは受け入れられたものではありません。:)
HepaKKes 2015年

5
私以外の誰かが気にするなら、プロセスは実際には列挙型です。
robobrobro 2015

1
Process.arguments同じNSProcessInfo.processInfo().argumentsですか?
フランクリンユー

5
最新のSwiftスナップショット(7/28スナップショットまたは7/29スナップショット)では、Processオブジェクトはオブジェクトと呼ばれていCommandLineます。Swift 3.0が正式にリリースされたら、これはおそらく完全に組み込まれるでしょう。
TheSoundDefense


46

トップレベルの定数C_ARGCとを使用しますC_ARGV

for i in 1..C_ARGC {
    let index = Int(i);

    let arg = String.fromCString(C_ARGV[index])
    switch arg {
    case "this":
        println("this yo");

    case "that":
        println("that yo")

    default:
        println("dunno bro")
    }
}

「配列」の1..C_ARGC最初の要素はC_ARGVアプリケーションのパスであるため、範囲を使用していることに注意してください。

C_ARGV変数は、実際には配列ではなく、配列のように、サブスクリプト可能です。


4
Objective-Cと同じように、NSProcessInfoを使用することもできます。
ジャックローレンス

3
NSProcessInfoにはFoundationが必要です。私の答えは財団を必要としません。Swift lang標準ライブラリを使用するだけです。
orj

7
C_ARCGサポートされなくなったようです。
juandesant 2015

2
C_ARGがツールの最新バージョンであるXCodeバージョン7.1(7B91b)では動作しないことを確認できます。
2015

8
あなたの代わりに使用することができますProcess.argcし、Process.argumentsそれはこのようになりますけれども、このために変更される可能性がありますCommandLine.argcし、CommandLine.arguments言語への最新の変更で。
TheSoundDefense 2016

14

古い「getopt」(Swiftで入手可能)を使用したい人は、これを参照として使用できます。私はGNUの例のSwift移植をCで作成しました。

http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

完全な説明付き。テスト済みで完全に機能します。Foundationも必要ありません。

var aFlag   = 0
var bFlag   = 0
var cValue  = String()

let pattern = "abc:"
var buffer = Array(pattern.utf8).map { Int8($0) }

while  true {
    let option = Int(getopt(C_ARGC, C_ARGV, buffer))
    if option == -1 {
        break
    }
    switch "\(UnicodeScalar(option))"
    {
    case "a":
        aFlag = 1
        println("Option -a")
    case "b":
        bFlag = 1
        println("Option -b")
    case "c":
        cValue = String.fromCString(optarg)!
        println("Option -c \(cValue)")
    case "?":
        let charOption = "\(UnicodeScalar(Int(optopt)))"
        if charOption == "c" {
            println("Option '\(charOption)' requires an argument.")
        } else {
            println("Unknown option '\(charOption)'.")
        }
        exit(1)
    default:
        abort()
    }
}
println("aflag ='\(aFlag)', bflag = '\(bFlag)' cvalue = '\(cValue)'")

for index in optind..<C_ARGC {
    println("Non-option argument '\(String.fromCString(C_ARGV[Int(index)])!)'")
}

0

CommandLine.argumentsArrayを使用して引数パーサーを作成し、好きなロジックを追加できます。

あなたはそれをテストすることができます。ファイルを作成するarguments.swift

//Remember the first argument is the name of the executable
print("you passed \(CommandLine.arguments.count - 1) argument(s)")
print("And they are")
for argument in CommandLine.arguments {
    print(argument)
}

コンパイルして実行します。

$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3

独自の引数パーサーを作成する際の問題は、すべてのコマンドライン引数の規則を考慮に入れていることです。既存の引数パーサーを使用することをお勧めします。

あなたは使うことができます:

  • Vaporのコンソールモジュール
  • Swift Package Managerが使用するTSCUtility引数パーサー
  • Appleがオープンソース化したSwift Argument Parser

3つすべてでコマンドラインツールを構築する方法について書きました。あなたはそれらをチェックして、どのスタイルがあなたに最も適しているかを決めるべきです。

あなたが興味を持っているならここにリンクがあります:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.