Linuxのシェルスクリプト

構文

 1.基本的なレイアウト

#! /bin/bash


 2.お知らせ

  2.1ログインSSH SHを使用して他のノードにコマンドを実行し、コンソールフィードバック情報の他のノードは、SHアウトコンソールプリント内のノードの実装でもあります

 参考に3.

識別子 DESC
$ * これは、すべての入力を指し、
$インデックス 最初のインデックスパラメータ
$# パラメータの数

 4.変数

変数、引用符に割り当てた値

 前記プロセス制御

  5.1を選択

if [ $a == $b ]
then
   echo "a is equal to b"
elif [ $a -gt $b ]
then
   echo "a is greater than b"
elif [ $a -lt $b ]
then
   echo "a is less than b"
else
   echo "None of the condition met"
fi

  5.2サイクル

for i in {1..5}
do
    echo $i
done


for i in 5 6 7 8 9
do
    echo $i
done


for FILE in $HOME/.bash*
do
   echo $FILE
done
break  #跳出所有循环
break n  #跳出第n层f循环
continue  #跳出当前循环
COUNTER=0
while [ $COUNTER -lt 5 ]
do
    COUNTER=`expr $COUNTER + 1`
    echo $COUNTER
done
case $变量名 in
"值 1")
;;
如果变量的值等于值1,则执行程序1,值
"值 2")
如果变量的值等于值2,则执行程序2
…省略其他分支…
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

 6.機能

  同等の三つの方法、3通りの方法で定義されたシェル関数

		f_name(){……}
		function f_name{……}
		function f_name(){……}

  渡すパラメータ、ブラケットは$ num個で直接使用することができる関数の本体で定義されていない時間のパラメータに注意を払うが必要です。注意,函数中的\$num和脚本的\$num不同

test(){
    echo $1  #接收第一个参数
    echo $2  #接收第二个参数
    echo $3  #接收第三个参数
    echo $#  #接收到参数的个数
    echo $*  #接收到的所有参数
}

test aa bb cc

  あなたがスクリプトに加えて、この機能を使用する場合は、EXPORT 函数名

  あなたは、直接呼び出すと、函数名 arg1 arg2

 7.リダイレクトと追記

$echo result > file  #将结果写入文件,结果不会在控制台展示,而是在文件中,覆盖写
$echo result >> file  #将结果写入文件,结果不会在控制台展示,而是在文件中,追加写

共通コマンド

  1. エコー
    引用符の有無にかかわらず、出力ラインの内容を
  2. SSH
  3. 睡眠

 1.CDH開始と停止

#! /bin/bash

#1 判断参数个数,如无参数输入,直接退出
argscount=$#
if((argscount == 0));
then
    echo ============================no args============================
    exit;
fi

#2 函数封装
function start(){
    echo ============================启动CDH:begin============================

    #   判断mysql是否启动,如果没启动,先启动mysql
    mysqlPortStat=`netstat -anp | grep 3306 | wc -l`
    if [ $mysqlPortStat == 0 ]
    then
        ssh node105 systemctl start mysqld
    fi
    echo "mysql 已经启动"

    #   启动CDH
    sleep 1s;

    ssh node105 /opt/cm-5.16.2/etc/init.d/cloudera-scm-server $1

    for((host=105;host < 108;host++));
    do
        ssh node$host /opt/cm-5.16.2/etc/init.d/cloudera-scm-agent $1
    done
    # 获取当前前后时间的从1970UTC为止的秒数
    start_datetime=`date +%s`
    # CDH启动最起码需要等待30s,所以先sleep 30s; 然后再轮循
    sleep 30s;

    #   监控7180端口,如果监听到数量大于0,说明CDH启动完成
    CDHPortCount=`netstat -anp | grep 7180 | wc -l`
    while [ $CDHPortCount == 0 ]
    do
        CDHPortCount=`netstat -anp | grep 7180 | wc -l`
        sleep 5s;
    done

    end_datetime=`date +%s`
    echo $end_datetime

    echo ============================启动CDH:successed,等待$[end_datetime-start_datetime]s============================
}

function stop(){
    echo ============================停止CDH:begin============================
    for((host=105;host < 108;host++));do
        ssh node$host /opt/cm-5.16.2/etc/init.d/cloudera-scm-agent $1
    done

    ssh node105 /opt/cm-5.16.2/etc/init.d/cloudera-scm-server $1
    echo ============================停止CDH:successed============================
}

function restart(){
    # 判断mysql是否启动,如果没启动,先启动mysql
    mysqlPortStat=`netstat -anp | grep 3306 | wc -l`
    if [ $mysqlPortStat == 0 ]
    then
        ssh node105 systemctl start mysqld
    fi
    echo "mysql 已经启动"
    #
    echo ============================重启CDH:begin============================
    for((host=105;host < 108;host++));
    do
        ssh node$host /opt/cm-5.16.2/etc/init.d/cloudera-scm-agent $1
    done

    ssh node105 /opt/cm-5.16.2/etc/init.d/cloudera-scm-server $1
    echo ============================重启CDH:successed============================
}

#3 根据输入参数执行相应操作
case $1 in
    "start")
        start $1;
    ;;
    "stop")
        stop $1;
    ;;
    "restart")
        restart $1;
    ;;
esac

 2.rrsync配布スクリプト

#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 获取当前用户名称
user=`whoami`

#5 循环
for((host=105; host<108; host++)); do
	echo ------------------- node$host --------------
	rsync -rvl $pdir/$fname $user@node$host:$pdir
done

 スクリプトの均一な実装を3.xcall

#! /bin/bash

for i in node105 node106 node107
do
	echo --------- $i ----------
	ssh $i "$*"
done
公開された21元の記事 ウォンの賞賛0 ビュー618

おすすめ

転載: blog.csdn.net/qq_34224565/article/details/104131079