Ich habe eine Reihe von Shell-Funktionen, die ich in meiner Befehlszeilenumgebung und in meinen Shell-Skripten verwende. Ich möchte zwei von ihnen, upper
und lower
zu 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_echo
ist 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 -e
fü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.
test -t
? zB[ ! -t 0 ] && echo stdin is not a terminal
- vergleiche mitecho 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 bietettest
aka[
.echo - -e
Drucke- -e
Antworten:
Dein Code:
So lesen Sie dies aus der Standardeingabe, wenn keine Argumente vorhanden sind:
Dies testet
$#
die Anzahl der Positionsparameter und wenn dies Null ist, wird dascat
Lesen aus dem Standardeingabestream verwendet, andernfalls werdenprintf
die Positionsargumente verwendet. Dies wird dann an weitergeleitettr
.Ich habe es entfernt,
return 0
da Sie wahrscheinlich den tatsächlichen Exit-Status der Pipeline wissen möchten.In
bash
können Sie tunWenn Argumente vorhanden sind, wird dies
tr
nur durch Bashs${parameter^^pattern}
Ersetzung verwendet, um alle Argumente in Großbuchstaben umzuwandeln (,,
in Kleinbuchstaben verwenden).Möglicherweise möchten Sie die
printf
Formatzeichenfolge so ändern , dass sie'%s '
nicht davon'%s\n'
abhängt, was Sie erreichen möchten.quelle