ฟังก์ชัน Bash ที่รับอินพุตจากพารามิเตอร์หรือไพพ์


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
cas

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และ piping ไปbase64

1
เพียง imo ไวยากรณ์ที่สะอาดecho and pipeอาจเร็วขึ้น .. ดูunix.stackexchange.com/questions/59007/และherestringฉันก็ทำผิดพลาด
Sundeep

2
คุณสามารถไพพ์อินพุตผ่านtr -d "\n"เพื่อลบตัวแบ่งบรรทัด
Julie Pelletier

3
base64 รองรับอินพุตหลายบรรทัดได้อย่างไร แน่นอนมันจะไร้ประโยชน์ถ้ามันไม่สวย ดูตัวเอง:ls -l /usr/bin/ | base64 | base64 -d
cas

1
btw, +1 คุณเป็นคำตอบที่ดีสำหรับคำถามที่มีความหมายเพียงอย่างเดียวหากเป็นเพียงจุดยืนสำหรับฟังก์ชันที่ซับซ้อนมากขึ้น
cas

4
คุณไม่จริงต้อง< /dev/stdin; โดยไม่ต้องไฟล์ก็จะอ่านจากอินพุตมาตรฐานมันสืบทอดมาจากแม่ของมันซึ่งเป็นbase64 /dev/stdin
chepner

2

คำตอบของ Sundeep ใช้งานได้base64เพราะยูทิลิตีนั้นไม่รองรับหลายบรรทัด การแก้ไขทั่วไปเพิ่มเติมสำหรับกรณีทั่วไปมากขึ้น

เป็นสิ่งที่ชอบ

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.