Hàm Bash chấp nhận đầu vào từ tham số hoặc ống


10

Tôi muốn viết hàm bash sau theo cách nó có thể chấp nhận đầu vào của nó từ một đối số hoặc một đường ống:

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

Sử dụng mong muốn:

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

2
có vẻ như là một chức năng vô nghĩa khi base64bashcó thể làm tất cả những điều đó bằng mọi cách. Tại sao viết một hàm chỉ để tránh sử dụng -dhoặc --decodetùy chọn? nếu bạn thực sự phải có một cái gì đó được gọi là b64decodesau đó alias b64decode='base64 --decode'. b64dsẽ ngắn hơn, mặc dù và tiết kiệm hơn nữa gõ.
cas

3
Bạn đã đúng, mặc dù điều này chỉ được sử dụng như một ví dụ.
tyrondis

Câu trả lời:


16

Bạn có thể sử dụng /dev/stdinđể đọc từ đầu vào tiêu chuẩn

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 kiểm tra nếu số lượng đối số dòng lệnh bằng không
  • base64 --decode <<< "$1"người ta cũng có thể sử dụng herestringthay vì sử dụng echovà đường ống đếnbase64

1
chỉ là một cú pháp imo sạch, echo and pipecó thể nhanh hơn .. xem unix.stackexchange.com/questions/59007/iêu và đó là herestring, tôi đã mắc lỗi
Sundeep

2
Bạn có thể dẫn đầu vào thông qua tr -d "\n"để loại bỏ các ngắt dòng.
Julie Pelletier

2
Base64 có hỗ trợ nhiều dòng đầu vào không? Tất nhiên là có, nó sẽ khá vô dụng nếu không. xem cho chính mình:ls -l /usr/bin/ | base64 | base64 -d
cas

1
btw, +1. của bạn là một câu trả lời tốt cho một câu hỏi chỉ có ý nghĩa nếu nó chỉ là một standin cho chức năng phức tạp hơn nhiều.
cas

4
Bạn không thực sự cần < /dev/stdin; không có tệp, base64đơn giản sẽ đọc từ đầu vào tiêu chuẩn mà nó kế thừa từ cha mẹ của nó, đó là /dev/stdin.
chepner

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.