आप स्विफ्ट में कमांड लाइन के तर्कों का उपयोग कैसे करते हैं?


121

आप स्विफ्ट में कमांड लाइन एप्लिकेशन के लिए कमांड लाइन तर्क कैसे एक्सेस करते हैं?


जवाबों:


7

Apple ने ArgumentParserयह करने के लिए पुस्तकालय जारी किया है :

हमें घोषणा करते हुए खुशी हो रही है ArgumentParser, एक नया ओपन-सोर्स लाइब्रेरी जो इसे सीधा बनाता है - यहां तक ​​कि सुखद भी! - स्विफ्ट में कमांड-लाइन तर्कों को पार्स करने के लिए।

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


स्विफ्ट तर्क पार्सर

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

एक प्रकार की घोषणा करके शुरू करें जो आपको कमांड लाइन से एकत्रित की जाने वाली जानकारी को परिभाषित करता है। प्रत्येक संग्रहीत संपत्ति को एक ArgumentParserसंपत्ति के रैपर से सजाएं, और उसके अनुरूप घोषित करें ParsableCommand

ArgumentParserपुस्तकालय कमांड लाइन तर्क या तो पार्स करता है, अपने आदेश प्रकार को दर्शाता है, और उसके बाद अपने कस्टम कार्यान्वित run()उपयोगी एक संदेश के साथ विधि या बाहर निकलता है।


305

अद्यतन ०१/१17/१ been: स्विफ्ट ३ के लिए उदाहरण का अद्यतन Processकिया गया है CommandLine


अपडेट 09/30/2015: स्विफ्ट 2 में काम करने के लिए उदाहरण को अपडेट करें।


यह वास्तव में फाउंडेशन के बिना ऐसा करना संभव है या C_ARGV और C_ARGC

स्विफ्ट मानक पुस्तकालय में एक संरचना CommandLineहोती है जिसमें Stringएस नामक एक संग्रह होता है arguments। तो आप इस तरह तर्कों पर स्विच कर सकते हैं:

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

5
अगर मेरे अलावा किसी को परवाह है, तो प्रक्रिया वास्तव में एक प्रतिज्ञान है
रोबोब्रोबो

1
के Process.argumentsरूप में ही है NSProcessInfo.processInfo().arguments?
फ्रैंकलिन यू

5
सबसे हाल ही में स्विफ्ट स्नैपशॉट (या तो 7/28 स्नैपशॉट या 7/29 स्नैपशॉट) में, Processऑब्जेक्ट को अब CommandLineऑब्जेक्ट के रूप में जाना जाता है । स्विफ्ट 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 को फाउंडेशन की आवश्यकता होती है। मेरे जवाब के लिए फाउंडेशन की आवश्यकता नहीं है। बस स्विफ्ट लैंग स्टैंडर्ड लिब का उपयोग करता है।
orj

7
C_ARCGलगता है अब समर्थन नहीं किया जाएगा।
जुलांडस

2
मैं पुष्टि कर सकता हूं कि C_ARG अब टूल के नवीनतम संस्करण, XCode संस्करण 7.1 (7B91b) के साथ काम नहीं करता है।
22

8
आप इसके बजाय उपयोग कर सकते हैं Process.argc और Process.argumentsइस बात के लिए है, हालांकि यह इस तरह दिखता है के लिए बदल किया जा सकता है CommandLine.argcऔर CommandLine.argumentsभाषा के लिए सबसे हाल ही में परिवर्तन के साथ।
TheSoundDefense 16

14

जो कोई भी पुराने "getopt" का उपयोग करना चाहता है (जो स्विफ्ट में उपलब्ध है) इसे संदर्भ के रूप में उपयोग कर सकते हैं। मैंने C में GNU उदाहरण का एक स्विफ्ट पोर्ट बनाया है:

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

आपके अपने तर्क पार्सर के निर्माण के साथ समस्या सभी कमांड लाइन तर्क सम्मेलनों को ध्यान में रख रही है। मैं एक मौजूदा तर्क पार्सर का उपयोग करने की सलाह दूंगा।

आप उपयोग कर सकते हैं:

  • वाष्प का कंसोल मॉड्यूल
  • TSCUtility Argument Parser स्विफ्ट पैकेज मैनेजर द्वारा उपयोग किया जाता है
  • स्विफ्ट आर्ग्यूमेंट पार्सर एप्पल द्वारा खुला-खट्टा है

मैंने तीनों पर कमांड-लाइन टूल बनाने का तरीका लिखा है। आपको उनकी जांच करनी चाहिए और तय करना चाहिए कि आपको कौन सी शैली सबसे अच्छी लगती है।

यदि आप यहाँ रुचि रखते हैं लिंक हैं:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.