बैश फ़ंक्शन जो पैरामीटर या पाइप से इनपुट स्वीकार करता है


10

मैं निम्नलिखित बैश फ़ंक्शन को इस तरह से लिखना चाहता हूं कि वह अपने इनपुट को एक तर्क या एक पाइप से स्वीकार कर सके:

b64decode() {
    echo "$1" | base64 --decode; echo
}

वांछित उपयोग:

$ b64decode "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ b64decode < file.txt
$ b64decode <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" | b64decode

2
एक व्यर्थ फ़ंक्शन की तरह लगता है जब base64और bashवैसे भी वह सब कर सकते हैं। केवल -dया --decodeविकल्प का उपयोग करने से बचने के लिए फ़ंक्शन क्यों लिखें ? यदि आप वास्तव में कुछ कहा जाता है b64decodeतो होना चाहिए alias b64decode='base64 --decode'b64dहालांकि कम होगा, और भी अधिक टाइपिंग को बचाने के लिए।
कैस

3
आप सही हैं, यह सिर्फ एक उदाहरण के रूप में इस्तेमाल किया गया था, हालांकि।
tyrondis

जवाबों:


16

आप /dev/stdinमानक इनपुट से पढ़ने के लिए उपयोग कर सकते हैं

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 आदेश पंक्ति तर्कों की संख्या शून्य है, तो जाँच करता है
  • base64 --decode <<< "$1"उपयोग herestringकरने echoऔर पाइप करने के बजाय एक का उपयोग कर सकते हैंbase64

1
बस एक साफ वाक्यविन्यास imo, echo and pipeतेजी से हो सकता है .. unix.stackexchange.com/questions/59007/… देखें और यह है herestring, मैंने एक गलती की
Sundeep

2
आप tr -d "\n"लाइनों को तोड़ने के माध्यम से इनपुट को पाइप कर सकते हैं ।
जूली पेलेटियर

3
बेस 64 समर्थन एकाधिक इनपुट लाइनों करता है? यदि ऐसा होता है, तो यह बहुत बेकार होगा। खुद के लिए देखें:ls -l /usr/bin/ | base64 | base64 -d
कैस

1
btw, +1। तुम्हारा एक सवाल का एक अच्छा जवाब है जो केवल तभी समझ में आता है जब यह बहुत अधिक जटिल कार्य के लिए सिर्फ एक स्टैंडिन हो।
कैस

4
आप वास्तव में जरूरत नहीं है < /dev/stdin; एक फ़ाइल के बिना, base64बस मानक इनपुट वह अपने माता-पिता, जो से विरासत से पढ़ा जाएगा /dev/stdin
चेपनर

2

सुदीप का जवाब इस लिए काम करता है base64क्योंकि उपयोगिता कई लाइनों का समर्थन नहीं करती है। अधिक सामान्य मामले के लिए एक अधिक सामान्य फिक्स

कुछ ऐसा है

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.