Ich möchte ein Bash-Skript wie folgt steuern:
#!/bin/sh
USER1=_parsefromfile_
HOST1=_parsefromfile_
PW1=_parsefromfile_
USER2=_parsefromfile_
HOST2=_parsefromfile_
PW2=_parsefromfile_
imapsync \
--buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --IgnoreSizeErrors \
--host1 $HOST1 --user1 $USER1 --password1 $PW1 --ssl1 --port1 993 --noauthmd5 \
--host2 $HOST2 --user2 $USER2 --password2 $PW2 --ssl2 --port2 993 --noauthmd5 --allowsizemismatch
mit Parametern aus einer Steuerdatei wie folgt:
host1 user1 password1 host2 user2 password2
anotherhost1 anotheruser1 anotherpassword1 anotherhost2 anotheruser2 anotherpassword2
Dabei steht jede Zeile für einen Skriptlauf, wobei die Parameter extrahiert und in Variablen umgewandelt werden.
Was wäre der eleganteste Weg, dies zu tun?
KLOPFEN
quelle
source
auch daran, aber ich denke, er will es nicht so.Etwas wie das. Das wichtige Bit ist das Lesen , um eine Zeile als Array zu erfassen.
quelle
[
und nachschaue[[
. ( tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS, wenn das OP interessiert ist.) Sehr nützlich.read -r USER1 HOST1 PW1 ...
. Beachten Sie, dass dies-r
fast immer verwendet werden sollte (es ermöglicht das wörtliche Lesen von Backslashes). Durchwhile
das Einleiten in wird eine Unterschale erstellt (was hier möglicherweise kein Problem darstellt). Sie können dies vermeiden, indem Sie die Datei in Folgendes umleitendone
:done < "$configfile"
. @SmallClanger: Siehe auch BashFAQ / 031 .read -r
Option.cat $configfile | while ... done
indem Sie es auf verschieben,while ..... done < "$configfile"
damit alle Variablen, die Sie in der while definieren oder ändern, nicht nur für die Dauer der while-Datei gelten (wenn sie sich in einer Subshell befinden), sondern auch danach existieren. Und es ist eine weniger "UUOC" (nutzlose Verwendung von Katze)Ich denke, Sie sollten so etwas wie getopts verwenden, wenn Sie Ihr Skript intelligent machen möchten, anstatt nur zu versuchen, Ihre Argumente auf Zahlenbasis zu lesen.
Etwas wie das.
Sie können auch Argumente analysieren. Weitere Details zum Tutorial finden Sie hier .
quelle
OPTIND=1; SILENT=":"; while getopts "${SILENT}a:bc:" opt ; do case $opt in a) val=$OPTARG; ... ;; b) ... ;; c) val=$OPTARG; ... ;; :) echo "(silent mode): -${OP TARG} needs argument"; ... ;; ?) echo "(non-silent) : option not recognized"; ... ;; esac ; done ; shift $((OPTIND - 1))
. OPTIND ist auf 1 gesetzt, sodass Sie die getopts bei Bedarf mehrmals aufrufen können, und die Verschiebung stellt sicher, dass Sie nur die verbleibenden Argumente verarbeiten. Verarbeitet standardmäßig $ 1 ... $ n, kann aber andere Argumente verarbeiten, wenn Sie sie nach dem "opt" und vor dem ";" obenIch habe hier eine funktionierende Lösung gefunden: https://af-design.com/2009/07/07/loading-data-into-bash-variables/
quelle