Linux入門小抄-part5-Shell程式設計基礎--練習
1、列印9*9乘法表
示例程式碼:
#!/bin/bash
for((i=1;i<=9;++i)) do for((j=1;j<=i;j++)) do echo -ne "$i*$j=$((i*j))\t" done echo done |
解釋
-n 不加換行符
-e 解釋轉義符
echo 換行
2、自動部署叢集的JDK
需求描述
公司內有一個N個節點的叢集,需要統一安裝一些軟體(jdk) 需要開發一個指令碼,實現對叢集中的N臺節點批量自動下載、安裝jdk |
思路
思考一下:我們現在有一個JDK安裝包在一臺伺服器上。那我們要實現這個目標:
|
Expect的使用
蛋疼點:假如在沒有配置SSH免密登入的前提下,我們要要是scp命令從一臺機器拷貝資料夾到另外的機器,會有人機互動過程,那我們怎麼讓機器自己實現人機互動?
靈丹妙藥:expect
命令 |
描述 |
set |
可以設定超時,也可以設定變數 |
timeout |
超時等待時間,預設 10s |
spawn |
執行一個命令 |
expect "" |
匹配輸出的內容 |
exp_continue |
繼續執行下面匹配 |
注意:如果機器沒有expect,則請先安裝expect
yum install -y expect
用法:
示例:觀看配置SSH免密登入的過程
[[email protected] bin]# vi testExpect.sh
#!/bin/bash
## 定義一個函式 sshcopyid(){ expect -c " spawn ssh-copy-id $1 expect { \"(yes/no)?\" {send \"yes\r\";exp_continue} \"password:\" {send \"$2\r\";exp_continue} } " }
## 呼叫函式執行 sshcopyid $1 $2 |
思路:模擬該人機互動過程,在需要互動的情況下,通過我們的檢測給輸入提前準備好的
指令碼實現
- 啟動指令碼initInstallJDK.sh
#!/bin/bash
SERVERS="192.168.123.201"
PASSWORD=hadoop
BASE_SERVER=192.168.123.202
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id $1;
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
*password:* {send -- $2\r;exp_continue;}
eof {exit 0;}
}";
}
ssh_copy_id_to_all() {
for SERVER in $SERVERS
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
ssh_copy_id_to_all
for SERVER in $SERVERS
do
scp installJDK.sh [email protected]$SERVER:/root
ssh [email protected]$SERVER chmod 755 installJDK.sh
ssh [email protected]$SERVER /root/installJDK.sh
done
- 安裝指令碼installJDK.sh
#!/bin/bash
BASE_SERVER=192.168.123.202
yum install -y wget
wget $BASE_SERVER/soft/jdk-8u73-linux-x64.tar.gz
tar -zxvf jdk-8u73-linux-x64.tar.gz -C /usr/local
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk1.8.0_73
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
總結
寫指令碼注意事項:
1、開頭加直譯器: #!/bin/bash,和註釋說明。
2、命名建議規則:變數名大寫、區域性變數小寫,函式名小寫,名字體現出實際作用。
3、預設變數是全域性的,在函式中變數 local 指定為區域性變數,避免汙染其他作用域。
4、set -e 遇到執行非 0 時退出指令碼, set -x 列印執行過程。
5、寫指令碼一定先測試再到生產上。