Fonction Bash qui accepte l'entrée du paramètre ou du tube

10

Je veux écrire la fonction bash suivante de manière à ce qu'elle puisse accepter son entrée à partir d'un argument ou d'un tuyau:

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

Utilisation souhaitée:

$ b64decode "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ b64decode < file.txt
$ b64decode <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" | b64decode
tyrondis
la source
2
semble être une fonction inutile quand base64et bashpeut faire tout cela de toute façon. pourquoi écrire une fonction juste pour éviter d'utiliser l' option -dou --decode? si vous devez vraiment avoir quelque chose appelé b64decodealors alias b64decode='base64 --decode'. b64dserait plus court, et économiser encore plus de frappe.
cas
3
Vous avez raison, cependant, cela n'a été utilisé qu'à titre d'exemple.
tyrondis

Réponses:

16

Vous pouvez utiliser /dev/stdinpour lire à partir de l'entrée standard

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 vérifie si le nombre d'arguments de ligne de commande est nul
  • base64 --decode <<< "$1"on peut également utiliser herestringau lieu d'utiliser echoet de la tuyauterie pourbase64
Sundeep
la source
1
juste une imo de syntaxe propre, echo and pipepourrait être plus rapide .. voir unix.stackexchange.com/questions/59007/… et c'est herestring, j'ai fait une erreur
Sundeep
2
Vous pouvez diriger l'entrée tr -d "\n"pour supprimer les sauts de ligne.
Julie Pelletier
3
base64 prend-il en charge plusieurs lignes d'entrée? bien sûr, il serait assez inutile si ce n'était pas le cas. voyez par vous-même:ls -l /usr/bin/ | base64 | base64 -d
cas
1
btw, +1. la vôtre est une bonne réponse à une question qui n'a de sens que s'il s'agit simplement d'une fonction beaucoup plus compliquée.
cas
4
Vous n'avez pas vraiment besoin du < /dev/stdin; sans fichier, base64lira simplement à partir de l'entrée standard dont il hérite de son parent, qui est /dev/stdin.
chepner
2

La réponse de Sundeep fonctionne base64car cet utilitaire ne prend pas en charge plusieurs lignes. Une solution plus générale pour le cas plus général

est quelque chose comme

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
TomRoche
la source