Napisałem szybki i brudny skrypt, aby sprawdzić czas niektórych raportów z serwisu internetowego:
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
Muszę zawinąć time
polecenie w podpowłokę, aby móc przekierować jego dane wyjściowe, ale to sprawia, że wartość $response
niedostępna dla powłoki nadrzędnej. Jak obejść ten problem?
bash
shell
io-redirection
subshell
ikonoklasta
źródło
źródło
{ … }
zamiast podpowłoki( … )
.Inni użytkownicy U&L: Przed zanegowaniem mojej odpowiedzi dotyczącej używania stylu C z
main()
funkcją, proszę odwiedzić ten link: https://unix.stackexchange.com/a/313561/85039 Używanie głównych funkcji w skryptach jest powszechną praktyką stosowaną przez wielu profesjonalistów na polu.Jak zauważył Gilles, podpowłoki nie mogą udostępniać zmiennych poza środowiskiem. Podejdźmy jednak do tego problemu z innej strony - jeśli napiszesz skrypt w funkcjach,
local
możesz zadeklarować zmienną jako i można ją edytować.W podręczniku bash 4.3
local
opis:Przykład:
Jak widać po 3 iteracjach funkcji zapętlania, zmienna jest modyfikowana.
źródło
outter
się, że będę odnosił się do globalnego wystąpieniavar
."$var"
nie jest potrzebne w wywołaniuoutter
. Nic nie robi. A takżelocal var=0
nic nie robi; funkcja połączeniaoutter
zastępujevar
, jak powiedziałeś."$var"
jako argument pozycyjnyoutter
; szczerze mówiąc, to jest z przyzwyczajenia. Czy możesz opracować co dolocal var=0
części?