Shell 02

shell用法

文件表达式

-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真 
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真 
-w filename 如果 filename可写,则为真 
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真。
filename1 -ot filename2 如果 filename1比 filename2旧,则为真。

整数变量表达式

-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

字符串变量表达式

if  [ a = b ]   如果string1等于string2,则为真
                字符串允许使用赋值号做等号
if  [ string1 !=  string2 ]  如果string1不等于string2,则为真    
if  [ -n string  ]       如果string 非空(非0),返回0(true)  
if  [ -z string  ]       如果string 为空,则为真
if  [ $sting ]          如果string 非空,返回0 (和-n类似) 

逻辑运算符

逻辑非 !          条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ]  如果不存在目录$num,这个就相当于这条命令 test ! -d $num

逻辑与 –a          条件表达式的并列
if [ 表达式1  –a  表达式2 ]

逻辑或 -o          条件表达式的或
if [ 表达式1  –o 表达式2 ]

括号的用途

# 在使用if语句时,经常会使用(), (()),[],[[]],{}等恐惧哦好,如下为几种括号间的区别对比:
():用于多个命令组,命令替换,初始化数组
(()):整数扩展,运算符,重定义变量值,算术运算比较
[]:bash内部命令,与test是等同的,正则字符范围,引用数组元素编号,不支持+-*/数学运算符,
逻辑测试使用-a,-o,[]就是test命令
[[]]:bash程序语言的关键字,不是一个命令,[[]]结构比[]结构更加通用,不支持+-*/数学运算符,
逻辑测试使用&&,||,!
{}:主要用于命令集合或者范围,例如mkdir -p /data/201{7,8}

# 注意点
$()与`` 是一样的,表示执行里面的命令,注意里面的前后空格的问题
echo $( date +%F ); echo `date +%F`

man查看帮助文档

man ssh  # 查看ssh帮助文档

exit的用法

#!/bin/bash
if [[ $1 -eq 1 ]];then
        echo 'hello world'
         # exit返回的整数是给$?使用的,表示退出了
        exit 66
else
        echo 'hello text'
        # exit返回的整数是给$?使用的
        exit 77
fi

./1.sh 1;echo $?;  # 结果为:66
./1.sh 2;echo $?;  # 结果为:77

echo 颜色

# 字颜色:30—–37
echo -e '\033[30m 黑色字 \033[0m' 
echo -e '\033[31m 红色字 \033[0m' 
echo -e '\033[32m 绿色字 \033[0m' 
echo -e '\033[33m 黄色字 \033[0m' 
echo -e '\033[34m 蓝色字 \033[0m' 
echo -e '\033[35m 紫色字 \033[0m' 
echo -e '\033[36m 天蓝字 \033[0m' 
echo -e '\033[37m 白色字 \033[0m' 


# 字背景颜色范围:40—–47 
echo -e "\033[40;37m 黑底白字 \033[0m" 
echo -e "\033[41;37m 红底白字 \033[0m" 
echo -e "\033[42;37m 绿底白字 \033[0m" 
echo -e "\033[43;37m 黄底白字 \033[0m" 
echo -e "\033[44;37m 蓝底白字 \033[0m" 
echo -e "\033[45;37m 紫底白字 \033[0m" 
echo -e "\033[46;37m 天蓝底白字 \033[0m" 
echo -e "\033[47;30m 白底黑字 \033[0m" 

date时间

# 年月日 时分秒
date +%Y%m%d_%H%M%S  

快捷键

ctrl+a  # 光标最前面
ctrl+e  # 后

注意点

# 变量建议使用""
例如:
SQL_DIR="/data/"
SQL_DUMP="${SQL_DIR}/dump/"

# 括号的使用

# set -e
写的每个脚本都应该在文件开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出

实战脚本

备份数据库脚本

#!/bin/bash
#sj
#dump hadoop01 sql
#By author zby
##################
SQL_CMD="/usr/bin/mysqldump"
SQL_HOST="172.20.10.13"
SQL_PORT=3306
SQL_USERNAME="root"
SQL_PASSWORD="Mysql123!"
SQL_DUMP_DIR="./`date +%F`"
DATABASE_NAMES=$*

if [ ! -d $SQL_DUMP_DIR ];then
        echo -e '\033[33m-------------------------------------------------\033[0m'
        echo -e '\033[32m create sql dump dir\033[0m'
        echo -e '\033[33m------------------------------------------------\033[0m'
        mkdir -p $SQL_DUMP_DIR
fi

for DB_NAME in $DATABASE_NAMES
do
# dump da bash
$SQL_CMD -h$SQL_HOST -P$SQL_PORT -u$SQL_USERNAME -p$SQL_PASSWORD --databases $DB_NAME > ${SQL_DUMP_DIR}/${DB_NAME}dump.sql

# 是否备份失败
if [ $? -eq 0 ];then
        echo -e '\033[33m-----------------------------------------------\033[0m'
        echo -e '\033[32m dump sql success \033[0m'
        echo -e '\033[33m-------------------------------------------------\033[0m'
else
        echo -e '\033[33m-------------------------------------------------\033[0m'
        echo -e '\033[31m dump sql failed, please check dump script  \033[0m'
        echo -e '\033[33m--------------------------------------------------\033[0m'
        # error exit
        exit 1
fi
done

防止攻击

查看攻击的ip地址

# 记录攻击ip的文件
/var/log/secure

# 例如该服务,禁止ip访问
/etc/hosts.deny
# 被禁止访问的ip,后面的数字是禁止的时间,到了该时间就结束了
sshd:172.20.10.3:deny  # 202002221820

数据同步

xsync.sh

#!/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 = 02; host <= 03; host++ )); do
    echo ------------------ hadoop$host ------------------
    rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

多个服务同时执行一条命令

xcall.sh

#!/bin/bash
pcount=$#
if [ pcount==0 ]; then
    echo "no args";
    exit;
fi

echo ----------- localhost -----------
$@
for (( host = 2; host <= 3; host++ )); do
    echo ----------- hadoop0$host ------------------
    ssh hadoop0$host $@
done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值