Ich habe ein schnelles und schmutziges Skript geschrieben, um einige Berichte von einem Webdienst zeitlich abzustimmen:
BASE_URL='http://example.com/json/webservice/'
FIRST=1
FINAL=10000
for report_code in $(seq 1 $FINAL); do
(time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time
echo $response # <------- this is out of scope! How do I fix that?
if [[ $response = '404' ]]; then
echo "Deleting report # ${report_code}!"
rm ${report_code}
else
echo "${report_code} seems to be good!"
fi
done
Ich muss den time
Befehl in eine Subshell einschließen, damit ich seine Ausgabe umleiten kann, aber das macht den Wert von $response
für die übergeordnete Shell nicht verfügbar. Wie komme ich um dieses Problem herum?
bash
shell
io-redirection
subshell
Bilderstürmer
quelle
quelle
{ … }
Element bringen , und genau das erkläre ich in meiner Antwort: Verwenden Sie die Befehlsgruppierung anstelle einer Unterschale( … )
.Mitbenutzer von U & L: Bevor Sie meine Antwort für die Verwendung von C-Stil mit
main()
Funktion ablehnen , besuchen Sie bitte diesen Link: /unix//a/313561/85039 Die Verwendung von Hauptfunktionen in Skripten ist eine gängige Praxis, die von vielen Fachleuten verwendet wird im Feld.Wie Gilles betonte, können Subshells keine Variablen außerhalb ihrer Umgebung verfügbar machen. Aber lassen Sie uns dieses Problem aus einem anderen Blickwinkel betrachten: Wenn Sie Ihr Skript in Funktionen schreiben, können Sie Variablen als deklarieren
local
und diese können bearbeitet werden.Aus dem Handbuch von Bash 4.3,
local
Beschreibung:Beispiel:
Wie Sie nach 3 Iterationen der Schleifenfunktion sehen können, wird die Variable geändert.
quelle
outter
, auf eine globale Instanz von zu verweisenvar
."$var"
wird beim Aufruf nicht benötigtoutter
. Es macht nichts. Undlocal var=0
macht auch nichts; Der Anrufoutter
wird überschriebenvar
, wie Sie angegeben haben."$var"
als Positionsargument entferntoutter
; um fair zu sein, ist dies eine Gewohnheit. Können Sie etwas näher erläuternlocal var=0
?