Ermitteln Sie, ob stdin in der Shell-Funktion weitergeleitet wird


7

Ich habe eine Reihe von Shell-Funktionen, die ich in meiner Befehlszeilenumgebung und in meinen Shell-Skripten verwende. Ich möchte zwei von ihnen, upperund lowerzu verhalten sich unterschiedlich , je nachdem , ob oder nicht Daten zu ihnen zu sein verrohrt. Beide Funktionen sind derzeit so geschrieben, dass sie Eingaben über an sie übergebene Argumente erhalten.

Dies ist die Definition von upper:

upper () {
    my_echo "${1}" | tr "[:lower:]" "[:upper:]"
    return 0
}

Dies ist die Definition von lower:

lower () {
    my_echo "${1}" | tr "[:upper:]" "[:lower:]"
    return 0
}

( my_echoist ein Python-Skript, das ich als Ersatz für geschrieben habe echo. Es soll alles ausgeben, was als Argument übergeben wird, während Escape-Sequenzen in ihre Literale konvertiert werden. Ich könnte jede Zeichenfolge drucken, ohne dass sie als Option interpretiert wird -efür echo. Die Art und Weise Unix Konsolen Arbeit wirft einen Schraubenschlüssel in das Ziel, so dass ich es auf Eis gelegt, so dass man es einfach ignorieren kann.)

Es gibt mehrere frühere Inkarnationen dieser Funktionen. Dies sind die Definitionen der Versionen, die mit Standardeingaben arbeiten:

upper () {
    tr "[:lower:]" "[:upper:]"
}

lower () {
    tr "[:upper:]" "[:lower:]"
}

Wenn die Funktion weitergeleitet wird, sollte sie wie oben beschrieben funktionieren. Ist dies nicht der Fall, sollte der erste Parameter gelesen werden.


4
haben Sie versucht test -t? zB [ ! -t 0 ] && echo stdin is not a terminal- vergleiche mit echo foo | [ ! -t 0 ] && echo stdin is not a terminal. Ich kann mich momentan nicht erinnern, ob dies Bash-spezifisch ist oder den meisten oder allen Sh-Varianten gemeinsam ist. das bietet testaka [.
Cas

echo - -eDrucke- -e
Katze

Antworten:


1

Dein Code:

upper () {
    my_echo "${1}" | tr "[:lower:]" "[:upper:]"
    return 0
}

So lesen Sie dies aus der Standardeingabe, wenn keine Argumente vorhanden sind:

upper () {
    ( (( $# )) && printf '%s\n' "$@" || cat ) |
    tr '[:lower:]' '[:upper:]'
}

Dies testet $#die Anzahl der Positionsparameter und wenn dies Null ist, wird das catLesen aus dem Standardeingabestream verwendet, andernfalls werden printfdie Positionsargumente verwendet. Dies wird dann an weitergeleitet tr.

Ich habe es entfernt, return 0da Sie wahrscheinlich den tatsächlichen Exit-Status der Pipeline wissen möchten.

In bashkönnen Sie tun

upper () {
    (( $# )) && printf '%s\n' "${@^^}" || tr '[:lower:]' '[:upper:]'
}

Wenn Argumente vorhanden sind, wird dies trnur durch Bashs ${parameter^^pattern}Ersetzung verwendet, um alle Argumente in Großbuchstaben umzuwandeln ( ,,in Kleinbuchstaben verwenden).

Möglicherweise möchten Sie die printfFormatzeichenfolge so ändern , dass sie '%s 'nicht davon '%s\n'abhängt, was Sie erreichen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.