Ich versuche, ein Skript zu schreiben, in dem überprüft werden soll, ob einer der an ein Bash-Skript übergebenen Parameter mit einer Zeichenfolge übereinstimmt. Die Art, wie ich es gerade eingerichtet habe, ist
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
aber es könnte eine große Anzahl von Parametern geben, also habe ich mich gefragt, ob es einen besseren Weg gibt, dies zu tun?
Vielen Dank
BEARBEITEN: Ich habe diesen Code ausprobiert und das Skript mit der Option -disableVenusBld aufgerufen, aber es wird immer noch "Starting build" ausgegeben. Mache ich etwas falsch? Danke im Voraus!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
linux
unix
bash
shell-script
iman453
quelle
quelle
#! /bin/sh -
, was Sie dort eingefügt haben, das Skript ausführbar gemacht und dann./t.sh
"Starting build"./t.sh -disableVenusBld
ausgegeben , aber nichts gedruckt.Antworten:
Es sieht so aus, als würden Sie Optionen in einem Shell-Skript verarbeiten. Hier ist die Redewendung dafür:
(Es gibt ein paar Konventionen zum Einrücken der
;;
, und einige Shells erlauben es Ihnen, die Optionen als anzugeben , um beim Anpassen der(--opt1)
Klammern zu helfen, aber dies ist die Grundidee.)quelle
shift
Anweisung wird verwendet, wenn die Anzahl der Argumente für einen Befehl nicht im Voraus bekannt ist, z. B. wenn Benutzer beliebig viele Argumente angeben können. In solchen Fällen werden die Argumente in einerwhile
Schleife mit einer Testbedingung von verarbeitet$#
. Diese Bedingung ist erfüllt, solange die Anzahl der Argumente größer als Null ist. Die$1
Variable und dieshift
Anweisung verarbeiten jedes Argument. Die Anzahl der Argumente wird bei jedershift
Ausführung verringert und wird schließlich zu Null, worauf diewhile
Schleife beendet wird. Quelleecho $1 | sed
Argumentwertverarbeitung .Das hat bei mir funktioniert. Es macht genau das, was Sie gefragt haben und nichts mehr (keine Optionsverarbeitung). Ob das gut oder schlecht ist, ist eine Übung für das Plakat :)
Dies nutzt eine spezielle Handhabung von
$*
und bash super-Test[[
...]]
Klammern.quelle
$*
um$@
, da die zu testende Zeichenfolge Leerzeichen haben könnte und Link zu bashs Dokumentation darüber hinzugefügt.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Ich denke, Sie müssen das tun, was in dieser Antwort vorgeschlagen wird . dh:bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
würde funktionieren.create a new certificate
und "Ihre Zeichenfolge" lautetcat
, wird eine Übereinstimmung gemeldet, dacertificate
enthältcat
.Wie wäre es mit der Suche (mit Platzhaltern) des gesamten Parameterraums:
Edit: Ok, ok, das war also keine beliebte Antwort. Wie wäre es mit diesem, es ist perfekt !:
Edit2: Ok, ok, vielleicht ist das nicht perfekt ... Ich denke, es funktioniert nur, wenn -param am Anfang der Liste steht und auch -paramXZY oder -paramABC entspricht. Ich denke immer noch, dass das ursprüngliche Problem sehr gut mit Bash-String-Manipulation gelöst werden kann, aber ich habe es hier nicht ganz geknackt ... -Kannst du?
quelle
${@#
) tut?$@
eine spezielle Variable ist, die alle Befehlszeilenargumente enthält? Nun, ich habe gerade die Bash-String-Manipulation für diese Variable verwendet, um den Teilstring "-disableVenusBld" zu entfernen, und dann vergleiche ich ihn mit dem Original$@
. Also , wenn$@
gleich-foo -bar
dann${@#-disableVenusBld}
noch sein würde-foo -bar
, damit ich sehen kann , dass die Flagge , die ich suche nicht vorhanden ist. Wenn es jedoch$@
gleich-foo -disableVenusBld -bar
dann${@#-disableVenusBld}
wäre-foo -bar
das nicht gleich$@
, so sagt mir, dass das Flag Ich suche vorhanden ist! Cool wie!Wenn Sie nur die Parameter testen müssen, die bei beginnen
$3
, führen Sie die Suche in einer Funktion durch:Aber ich frage mich, warum Sie das überhaupt versuchen, es ist keine alltägliche Notwendigkeit. Normalerweise bearbeiten Sie die Optionen in der Reihenfolge, wie in Dennis 'Antwort auf Ihre vorherige Frage .
quelle