Tolong jelaskan kepada saya mengapa echo
pernyataan terakhir kosong? Saya berharap itu XCODE
bertambah di while loop ke nilai 1:
#!/bin/bash
OUTPUT="name1 ip ip status" # normally output of another command with multi line output
if [ -z "$OUTPUT" ]
then
echo "Status WARN: No messages from SMcli"
exit $STATE_WARNING
else
echo "$OUTPUT"|while read NAME IP1 IP2 STATUS
do
if [ "$STATUS" != "Optimal" ]
then
echo "CRIT: $NAME - $STATUS"
echo $((++XCODE))
else
echo "OK: $NAME - $STATUS"
fi
done
fi
echo $XCODE
Saya sudah mencoba menggunakan pernyataan berikut alih-alih ++XCODE
metode
XCODE=`expr $XCODE + 1`
dan itu juga tidak akan mencetak di luar pernyataan while. Saya rasa saya melewatkan sesuatu tentang variabel scope di sini, tapi halaman manual lama tidak menunjukkannya kepada saya.
Jawaban:
Karena Anda melakukan piping ke while loop, sub-shell dibuat untuk menjalankan while loop.
Sekarang proses anak ini memiliki salinan lingkungannya sendiri dan tidak dapat meneruskan variabel apa pun kembali ke induknya (seperti dalam proses unix apa pun).
Oleh karena itu, Anda perlu merestrukturisasi agar Anda tidak menyalurkan ke loop. Alternatifnya, Anda dapat menjalankan fungsi, misalnya, dan
echo
nilai yang ingin Anda kembalikan dari sub-proses.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
sumber
Masalahnya adalah proses yang disatukan dengan pipa dijalankan dalam subkulit (dan karenanya memiliki lingkungannya sendiri). Apapun yang terjadi di dalam
while
tidak mempengaruhi apapun di luar pipa.Contoh spesifik Anda dapat diselesaikan dengan menulis ulang pipa ke
atau mungkin
sumber
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
setiap hari. Pertimbangkan bahwa Anda dapat menggunakan beberapa sekaligus dan memperlakukannya seperti file ... KEMUNGKINAN!Ini seharusnya bekerja juga (karena echo dan while berada di subkulit yang sama):
sumber
Satu opsi lagi:
EDIT: Di sini, xsel adalah persyaratan (instal). Alternatifnya, Anda dapat menggunakan xclip:
xclip -i -selection clipboard
sebagai gantixsel -i -p
sumber
lihat apakah perubahan itu membantu
sumber
Pilihan lainnya adalah mengeluarkan hasil ke dalam file dari subkulit dan kemudian membacanya di shell induk. sesuatu seperti
sumber
Saya menyiasatinya ketika saya membuat du kecil saya sendiri:
Intinya adalah saya membuat subkulit dengan () yang berisi variabel SUM saya dan while, tetapi saya menyalurkan ke whole () daripada ke while itu sendiri, yang menghindari gotcha.
sumber