source

Swift에서 명령줄 인수에 액세스하는 방법은 무엇입니까?

manycodes 2023. 5. 1. 21:34
반응형

Swift에서 명령줄 인수에 액세스하는 방법은 무엇입니까?

Swift에서 명령줄 응용 프로그램에 대한 명령줄 인수에 액세스하는 방법은 무엇입니까?

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


2015년 09월 30일 업데이트: Swift 2에서 작동하도록 예제 업데이트.


Foundation 없이도 실제로 이 작업을 수행할 수 있습니다. C_ARGV그리고.C_ARGC.

Swift 표준 라이브러리에는 다음과 같은 구조가 포함되어 있습니다.CommandLine의 컬렉션을 가지고 있습니다.String라고 불리는arguments따라서 다음과 같은 인수를 사용할 수 있습니다.

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

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

    default:
        print("an argument")
    }
}

Swift 3에서는 다음 대신 enum을 사용합니다.Process

그래서:

let arguments = CommandLine.arguments

최상위 수준 상수 사용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"array"는 응용 프로그램의 경로입니다.

C_ARGV변수는 실제로 배열이 아니지만 배열처럼 하위 스크립팅이 가능합니다.

Apple은 다음 제품을 출시했습니다.ArgumentParser이를 위한 라이브러리:

발표하게 되어 기쁩니다.ArgumentParser간단하면서도 재미있는 새로운 오픈 소스 라이브러리!Swift에서 명령줄 인수를 구문 분석합니다.

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


신속한 논쟁 파서

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

명령줄에서 수집해야 하는 정보를 정의하는 유형을 선언하는 것으로 시작합니다.저장된 각 속성을 다음 중 하나로 장식ArgumentParser의 재산 포장지, 그리고 준수를 선언합니다.ParsableCommand.

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

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

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)])!)'")
}

다음을 사용하여 인수 파서를 만들 수 있습니다.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

고유한 인수 구문 분석기를 구축할 때 발생하는 문제는 모든 명령줄 인수 규칙을 고려하는 것입니다.기존 인수 구문 분석기를 사용하는 것이 좋습니다.

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

  • 증기 콘솔 모듈
  • Swift Package 관리자가 사용하는 TSC 유틸리티 인수 구문 분석기
  • Apple이 오픈 소스로 제공하는 Swift Argument 파서

저는 세 가지 모두에서 명령줄 도구를 구축하는 방법에 대해 썼습니다.당신은 그것들을 확인하고 어떤 스타일이 당신에게 가장 잘 어울리는지 결정해야 합니다.

관심이 있는 경우 다음 링크를 참조하십시오.

언급URL : https://stackoverflow.com/questions/24029633/how-do-you-access-command-line-arguments-in-swift

반응형