Swift에서 명령 줄 인수에 어떻게 액세스합니까?


답변:


7

Apple ArgumentParser은이를 위해 라이브러리를 출시했습니다 .

ArgumentParser간단하고 즐겁게 사용할 수있는 새로운 오픈 소스 라이브러리 인 을 발표하게되어 기쁩니다 ! — Swift에서 명령 줄 인수를 구문 분석합니다.

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


신속한 인수 파서

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

명령 줄에서 수집해야하는 정보를 정의하는 유형을 선언하여 시작합니다. ArgumentParser의 속성 래퍼 중 하나를 사용하여 저장된 각 속성을 장식 하고 ParsableCommand.

ArgumentParser라이브러리는 명령 줄 인수를 구문 분석 명령 유형을 인스턴스화 한 다음 중 하나를 사용자 정의 실행 run()유용한 메시지와 함께 방법 또는 종료.


305

업데이트 01/17/17 : Swift 3의 예제가 업데이트 Process되었습니다 CommandLine.


업데이트 09/30/2015 : Swift 2에서 작동하도록 예제를 업데이트했습니다.


실제로 Foundation 또는 C_ARGVC_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는 이미 문자열 배열이므로 새로 만들 필요가 없습니다.
Lance

9
거의 항상 가장 좋은 답변은 허용되는 답변이 아닙니다. :)
HepaKKes 2015 년

5
나 외에 다른 사람이 신경 쓰면 Process는 실제로 열거 형 입니다.
robobrobro

1
Process.arguments은 동일 NSProcessInfo.processInfo().arguments?
Franklin Yu

5
가장 최근의 Swift 스냅 샷 (7/28 스냅 샷 또는 7/29 스냅 샷)에서 Process객체는 이제 객체로 알려져 CommandLine있습니다. 이것은 Swift 3.0이 공식적으로 출시되면 완전히 통합 될 것입니다.
TheSoundDefense


46

최상위 상수 C_ARGCC_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를 사용할 수도 있습니다.
Jack Lawrence

3
NSProcessInfo에는 Foundation이 필요합니다. 내 대답에는 재단이 필요하지 않습니다. 신속한 lang 표준 lib를 사용합니다.
ORJ

7
C_ARCG더 이상 지원되지 않는 것 같습니다.
juandesant

2
C_ARG가 더 이상 최신 버전의 도구 인 XCode 버전 7.1 (7B91b)에서 작동하지 않음을 확인할 수 있습니다.
svth

8
대신 사용할 수 있습니다 Process.argc그리고 Process.arguments그것은 다음과 같습니다 불구하고이 들어로 변경 될 수 있습니다 CommandLine.argcCommandLine.arguments언어에 대한 가장 최근의 변경.
TheSoundDefense

14

이전 "getopt"(Swift에서 사용 가능)를 사용하려는 사람은 누구나 이것을 참조로 사용할 수 있습니다. C에서 GNU 예제의 Swift 포트를 만들었습니다.

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

전체 설명과 함께. 테스트를 거쳐 완벽하게 작동합니다. 재단도 필요하지 않습니다.

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.arguments배열 을 사용하여 인수 파서를 만들고 원하는 논리를 추가 할 수 있습니다.

테스트 할 수 있습니다. 파일 생성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

자체 인수 구문 분석기를 작성하는 데있어 문제는 모든 명령 줄 인수 규칙을 고려하는 것입니다. 기존 Argument Parser를 사용하는 것이 좋습니다.

다음을 사용할 수 있습니다.

  • Vapor의 콘솔 모듈
  • Swift Package 관리자가 사용하는 TSCUtility Argument Parser
  • Apple에서 오픈 소스로 제공하는 Swift Argument Parser

세 가지 모두에서 명령 줄 도구를 빌드하는 방법에 대해 작성했습니다. 당신은 그것들을 확인하고 당신에게 가장 적합한 스타일을 결정해야합니다.

관심이 있다면 여기에 링크가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.