1. 程式人生 > >Linux入門小抄-part5-Shell程式設計基礎--練習

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安裝包在一臺伺服器上。那我們要實現這個目標:

  1. 把包傳到每臺伺服器,或者通過本地yum源的方式去伺服器取
  2. 給每臺一臺機器傳送一個安裝指令碼,並且讓指令碼自己執行
  3. 要寫一個啟動指令碼,用來執行以上兩部操作

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


思路:模擬該人機互動過程,在需要互動的情況下,通過我們的檢測給輸入提前準備好的

指令碼實現

  1. 啟動指令碼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

  2. 安裝指令碼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、寫指令碼一定先測試再到生產上。