2012-12-11 73 views
1

我的操作系統是CentOS 6.3。 我有一個bash腳本,它獲取mysql從屬狀態並給用戶菜單一些操作。當一個行動發生時,它會自我刷新。下面是一個簡單的例子:爲什麼在我的bash腳本中grep結果沒有按預期更新?

#!/bin/sh 
server_status_detect() { 
    rm -f /root/slave.status 
    mysql -u${MYSQL_USER} -p${MYSQL_PASS} -e 'show slave status \G' 2>&1 1>/root/slave.status 
    #some parsing of the file to see if threads are running and so on, done like this 
    Slave_IO_Running=$(grep '\sSlave_IO_Running:' /root/slave.status | awk '{ print $2 }'); 
} 
themenu() { 
    clear 
    server_status_detect 
    echo -e "Slave running? "$Slave_IO_Running; 
    echo "Available actions:" 
    #print actions 
} 

while true 
do 
    themenu 
    read answer 
    case $answer in 
     e) menu_network_pick;; 
     d) menu_mount_pick;; 
     m) menu_master_pick;; 
     p) menu_repair_replication_pick;; 
     t) menu_restart_replication_pick;; 
     r) menu_reboot_pick;; 
     s) menu_shutdown_pick;; 
     *) continue;; 
    esac 
done 

一切正常,狀態文件重新創建每次迭代中,它包含了實際數據。但是,腳本顯示拳頭解析的數據!似乎它不會每次迭代都解析文件,它只會在第一次執行時才執行解析,之後只會顯示它記住的結果。這怎麼會發生?

+0

你怎麼調用這個腳本?你能告訴我們這個叫它的線嗎? (聽起來像它可能是源代碼而不是被執行) – nullrevolution

+0

我通過/path/to/script/menu.sh命令從終端執行它。或者它在用戶登錄時自動執行(它位於.bash_profile中)。 –

+0

是'grep'中的'\ s' \ sSlave_IO_Running:''應該表示一個空白字符嗎?如果是,請使用'grep -P'來啓用Perl兼容的正則表達式。 –

回答

0

恥辱!我犯了一個愚蠢的錯誤!

在grepping之前,我有一個if,它在第二次和併發迭代中變爲false,因此greps甚至沒有執行,因此變量保持不變。問題關閉,bash不瘋狂,這是關於人類:)

1

我試圖通過使用腳本來複制問題,但我沒有遇到問題。

你能去替代

mysql -u${MYSQL_USER} -p${MYSQL_PASS} -e 'show slave status \G' 2>&1 1>/root/slave.status 
Slave_IO_Running=$(grep '\sSlave_IO_Running:' /root/slave.status | awk '{ print $2 }'); 

date > /root/slave.status 
Slave_IO_Running=$(grep 'Dec' /root/slave.status | awk '{ print $4 }'); 

,看看腳本顯示刷新時間我

相關問題