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 ]
括号的用途
():用于多个命令组,命令替换,初始化数组
(()):整数扩展,运算符,重定义变量值,算术运算比较
[]:bash内部命令,与test是等同的,正则字符范围,引用数组元素编号,不支持+-*/数学运算符,
逻辑测试使用-a,-o,[]就是test命令
[[]]:bash程序语言的关键字,不是一个命令,[[]]结构比[]结构更加通用,不支持+-*/数学运算符,
逻辑测试使用&&,||,!
{}:主要用于命令集合或者范围,例如mkdir -p /data/201{7,8}
$()与`` 是一样的,表示执行里面的命令,注意里面的前后空格的问题
echo $( date +%F ); echo `date +%F`
man查看帮助文档
man ssh
exit的用法
#!/bin/bash
if [[ $1 -eq 1 ]];then
echo 'hello world'
exit 66
else
echo 'hello text'
exit 77
fi
./1.sh 1;echo $?;
./1.sh 2;echo $?;
echo 颜色
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'
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,这句语句告诉bash如果任何语句的执行结果不是true则应该退出
实战脚本
备份数据库脚本
#!/bin/bash
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
$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'
exit 1
fi
done
防止攻击
查看攻击的ip地址
/var/log/secure
/etc/hosts.deny
sshd:172.20.10.3:deny
数据同步
xsync.sh
#!/bin/bash
pcount=$#
if [ pcount == 0 ]; then
echo "no args"
exit;
fi
p1=$1
fname=`basename $p1`
echo "fname=$fname"
pdir=`cd -P $( dirname $p1 );pwd`
echo "pdir=$pdir"
user=`whoami`
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