Saya telah menulis skrip cepat dan kotor untuk mencatat waktu beberapa laporan dari layanan web:
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
Saya perlu membungkus time
perintah dalam sebuah subkulit sehingga saya dapat mengarahkan kembali outputnya, tetapi itu membuat nilai $response
tidak tersedia untuk shell induk. Bagaimana saya mengatasi masalah ini?
bash
shell
io-redirection
subshell
iconoclast
sumber
sumber
{ … }
daripada subkulit( … )
.Rekan pengguna U&L: Sebelum menurunkan jawaban saya untuk menggunakan C-style with
main()
function, silakan kunjungi tautan ini: https://unix.stackexchange.com/a/313561/85039 Menggunakan fungsi utama dalam skrip adalah praktik umum, yang digunakan oleh banyak profesional di lapangan.Seperti yang ditunjukkan Gilles, subkulit tidak dapat membuat variabel tersedia di luar lingkungan mereka. Tapi mari kita mendekati masalah ini dari sudut lain - jika Anda menulis skrip Anda dalam fungsi, dimungkinkan untuk mendeklarasikan variabel sebagai
local
dan yang dapat diedit.Dari manual bash 4.3,
local
deskripsi:Contoh:
Seperti yang Anda lihat setelah 3 iterasi dari fungsi looping, variabel dimodifikasi.
sumber
outter
untuk merujuk ke contoh globalvar
."$var"
tidak diperlukan dalam panggilan keluaroutter
. Itu tidak melakukan apa-apa. Dan jugalocal var=0
tidak melakukan apa pun; panggilan oufoutter
tidak menimpavar
, seperti yang Anda sebutkan."$var"
sebagai argumen posisioutter
; Agar adil, ini karena kebiasaan. Bisakah Anda menguraikan tentanglocal var=0
berpisah?