容易想到構建乙個陣列儲存空閒節點名稱,隨後遍歷該陣列傳送指令。
**如下:
#!/bin/bash
echo checking hosts...
val=()
for $host in server-,}do&
done
wait
for host in $
do ssh user@$host bash ~/work.sh
done
上述**看似沒毛病,可執行沒反應。
通過新增echo $
列印變數發現陣列val值為空!
刪去節點檢測的&和wait改為順序執行後val可以正常賦值?
順序檢測36臺伺服器效率過低,方案否決!
**為何後台執行變數無法追加到val陣列?
難道shell變數也存在作用域?分全域性和區域性?
查閱資料得:
在 shell 中定義的變數,預設就是全域性變數。比如,開啟兩個終端同時訪問變數$a的值可以是不同的。所謂全域性變數,就是指變數在當前的整個 shell 程序中都有效。
每個 shell 程序都有自己的作用域,彼此之間互不影響。
而for do {}& done wait
結構下,後台產生了多個相互獨立的程序同時執行,
加速同時也隔離彼此變數傳遞,導致主程序變數val無法被賦值。
既然如此,只需要聚合多程序的結果一起傳入後續函式即可實現變數跨程序傳遞。
這裡將節點判斷部分封裝為乙個函式,空閒節點名稱直接列印到標準輸出。
再將函式輸出作為輸入構建迴圈列表,最終滿足要求。
修改後**如下:
#!/bin/bash
echo checking hosts...
check(),}do&
done
wait
}for host in `check`
do ssh user@$host bash ~/work.sh
done
shell與python間傳遞變數方法
python shell 1.環境變數 python view plain copy import os var 123 或var 123 os.environ var str var environ的鍵值必須是字串 os.system echo var 2.字串連線 python view pla...
awk與shell之間的變數傳遞方法
linux下awk是個好東東,處理一些文字檔案會非常方便。而在linux下嘛,經常會和shell打交道,所以awk和shell之間的變數相互傳遞,有時還是很有必要的,所以簡單總結一下吧。awk中使用shell中的變數 一 var 這種寫法大家無需改變用 括起awk程式的習慣,是老外常用的寫法.如 v...
如何傳遞shell變數給aw
一 var 這種寫法大家無需改變用 括起awk程式的習慣,是老外常用的寫法.如 var test awk begin 這種寫法其實際是雙括號變為單括號的常量,傳遞給了awk.如果var中含空格,為了shell不把空格作為分格符,便應該如下使用 var this is a test awk begin...