Shell
set nocompatible set history=100 filetype on filetype plugin on filetype indent on set autoread set mouse=c syntax enable set cursorline hi cursorline guibg=#00ff00 hi CursorColumn guibg=#00ff00 set foldenable set foldmethod=manual set foldcolumn=0 setlocal foldlevel=3 set foldclose=all nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> set expandtab set tabstop=4 set shiftwidth=4 set softtabstop=4 set smarttab set ai set si set wrap set sw=4 set wildmenu set ruler set cmdheight=1 set lz set backspace=eol,start,indent set whichwrap+=<,>,h,l set magic set noerrorbells set novisualbell set showmatch set mat=4 set hlsearch set ignorecase set encoding=utf-8 set fileencodings=utf-8 set termencoding=utf-8 set smartindent set cin set showmatch set guioptions-=T set guioptions-=m set vb t_vb= set laststatus=4 set pastetoggle=<F9> set background=dark highlight Search ctermbg=black ctermfg=white guifg=white guibg=black autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" func SetTitle() if expand("%:e") == 'sh' call setline(1, "#!/bin/bash") call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%")) call setline(4, "# Version: V1.0") call setline(5, "# Author: liushuo") call setline(6, "# Organization: www.shuoiliu.com") call setline(7, "# Created Time : ".strftime("%F %T")) call setline(8, "# Description:") call setline(9, "##############################################################") endif endfunc
用户家目录下 新建文件为 .vimrc
cat /etc/password
查看用户使用的解释器
一般以.sh结尾、用file查看文件类型(shell)
#!/bin/bash # 默认使用的解释器
变量
以字母开头
${week} == $week
全局变量 :环境变量
$PATH $PS1 $LANG
name=1213
export name # 局部转全局(临时),然后再脚本内就可以使用了
unset name 取消变量、刚声明的全局变量
特殊变量
$0 # 脚本的名字
$1 # 第一个参数
$2 # ....
$3 # ....
$n # 第n个参数
$# # 表示脚本一共有多少个参数
$* # h获取脚本的所有参数; 最后会当做一个参数
$@ # 获取脚本的所有参数; 不会当做一个参数
echo $? # 显示上一个命令的执行结果code 非0错误;0成功; 判断软件是否安装成功
$$ # 获取当前执行脚本的进程号
$! # 获取上一个后台工作进程的进程号
$_ # 获取上一个执行脚本的最后一个参数
变量子串

echo ${#oldboy} echo $oldboy|wc -L echo $oldboy|awk '{print length}'
expr length oldbody

数组
数组定义 1、array=(one two three four) 2、array=([0]=one [1]=two [2]=three [3]=four) 3、array[0]=one 获取值 echo ${array[@]} echo ${array[@]} echo ${array[0]} 删除值 unset array[1] 但是下标位置不会改变 使用for循环打印数组元素 array=(1 2 3 4 5) for n in ${array[*]} do echo $n done echo ===================== #i为数组下标 for ((i=0;i<${#array[*]};i++)) do echo ${array[i]} done
运算命令

expr '':'' > /dev/null 可以匹配
与环境变量相关的目录
环境变量存储目录
/etc/profile /etc/bashrc /etc/profile.d/ 用户环境变量配置文件 ~/.bash_profile ~/.bashrc

变量赋值方法-read
从命令行读取内容
read -p "input x y :" x y
-t 10 # 10秒超时
循环
条件表达式

[ -f /root/oldboy.txt ] 判断这个文件是否存在;两侧有空格
echo $?
[ -d /root/123.txt ] 判断目录存不存在
[ 1 -eq 1 ]
[ 1 -ne 1 ] 不等于
[ 1 -gt 1 ] 大于
[ 1 -ge 1 ] 大于等于
[ 1 -lt 1 ] 小于
[ 1 -le 1 ] 小于等于
更多查看man test
[ $# -eq 2] && echo 'args:'$# 前一个执行成功,再执行后边的
[ -d /oldboy ] || mkdir -p /oldboy 前一个执行失败,在执行后边的


逻辑测试表达式
在[] 和test中使用操作符 在[[]]和(())中使用操作符 说明
-a $$ and与,两端都为震则为真
-o || or或,两端有一个为真则为真
! ! not非,相反则为真

if语句
# 单分支
num1=$1
num2=$2
if [ $num1 -gt $num2 ];then
echo $num1 greater than $num2
fi
# 双分支
if [ $# -ne 2 ];then
echo 'Usage: please inpit 2 number: num1 num2'
exit
fi
num1=$1
num2=$2
if [ $num1 -gt $num2 ];then
echo $num1 greater than $num2
else
echo $num1 less than $num2
fi
# 多分支
num1=$1 num2=$2 if [ $num1 -gt $num2 ];then echo $num1 greater than $num2
elif [ $num1 -eq $num2 ];then
echo $num1 greater than $num2
else
echo $num1 less than $num2
fi
for循环
语法
开机
for 变量名字 in 列表
do
命令
done
--------------------------------
for num in 1 2 3 4 5 6 # 生成序列的东西 {01..10}
do
echo num #echo chkconfig $name off
done
$(chkconfig |egrep "crond|sshd|rsyslog|network|sysstat" -v |awk '{print $1}')
# sh -x 123.sh # 调试、执行过程
for ((i=1;i<=5;i++))
do
echo $i
done
for i in `seq 100` do ((num+=i)) done echo $num
mkdir /oldboy -p cd /oldboy touch stu_102999_1_finished.jpg stu_102999_2_finished.jpg stu_102999_3_finished.jpg touch stu_102999_4_finished.jpg stu_102999_5_finished.jpg for file in `ls ./*.jpg` do mv $file `echo ${file/_finished/}` done
rename "_finished" "" *.jpg
while
只要满足条件,就一直循环下去
while <条件表达式>
do
指令
if <>
then
continue
fi
done
while ((i<=100))do ((num+=i))
((i++)) done echo $num
until
直到满足某个条件满足,退出循环
until [ $# -eq 0 ] do ehco $*
shift done
case
case 变量 in arg1 ) 指令 ;; arg2) 指令 ;; *) 可以不写;; esac
函数

程序的加载顺序: 1、系统别名 2、函数 3、系统命令 4、可执行文件
在函数内使用的$n 函数名 参数1 参数2 $0 是父脚本的名称
############### 模块化 #############
. ./functions
func $1
# return返回值,使用$?问号
函数内局部变量 local name=123;不用local函数外也会生效
shell脚本
#!/bin/bash lockfile=/var/lock/subsys/rsyncd . /etc/init.d/functions rsyncd_pid_file_path=/var/run/rsyncd.pid start(){ rsync --daemon &>/dev/null retval=$? if [ $retval -eq 0 ] then action "rsync startup ok" /bin/true touch $lockfile return $retval else action "rsync startup fail" /bin/false return $retval fi } stop(){ if test -s "$rsyncd_pid_file_path" then rsyncd_pid=`cat $rsyncd_pid_file_path` if (kill -0 $rsyncd_pid &>/dev/null) then kill $rsyncd_pid retval=$? if [ $retval -eq 0 ] then action "rsync stop ok" /bin/true rm $lockfile return $retval else action "rsync stop fail" /bin/false return $retval fi else echo " rsyncd process is not exist." return 2 fi else echo "$rsyncd_pid_file_path is not exist,or rsyncd does not startup." fi } case "$1" in start) start retval=$? ;; stop) stop retval=$? ;; restart) stop sleep 1 start retval=$? ;; *) echo "usage:$0 {start|stop|restart}" exit 1 esac exit $retval
#!/bin/bash cat <<EOF 1.install lamp 2.install lnmp 3.exit EOF read -p "请选择一个序号(必须是数字):" num #1.判断是否为整数 expr 2 + $num &>/dev/null if [ $? -ne 0 ] then echo "Usage:$0 {1|2|3}" exit 1 fi #2.判断执行处理 case $num in 1) echo "install lamp..." ;; 2) echo "install lnmp..." ;; 3) echo "bye." exit ;; *) echo "Usage:$0 {1|2|3}" exit 1 esac
#!/bin/bash . /etc/init.d/functions if [ $# -ne 2 ] then echo "usage:$0 localdir remotedir" exit 1 fi for n in 8 41 42 43 do scp -rp $1 10.0.0.$n:$2 &>/dev/null if [ $? -eq 0 ] then action "10.0.0.$n is successful" /bin/true else action "10.0.0.$n is failure" /bin/false fi done
lockfile=/var/lock/subsys/mysqld . /etc/init.d/functions mysqld_pid_file_path="/application/mysql/data/web01.pid" mysqld_safe=/application/mysql/bin/mysqld_safe start(){ /bin/sh $mysqld_safe --datadir=/application/mysql/data --pid-file=$mysqld_pid_file_path &>/dev/null & retval=$? if [ $retval -eq 0 ] then action "mysql startup ok" /bin/true touch $lockfile return $retval else action "mysql startup fail" /bin/false return $retval fi } stop(){ if test -s "$mysqld_pid_file_path" then mysqld_pid=`cat $mysqld_pid_file_path` if (kill -0 $mysqld_pid &>/dev/null) then kill $mysqld_pid retval=$? if [ $retval -eq 0 ] then action "mysql stop ok" /bin/true rm $lockfile return $retval else action "mysql stop fail" /bin/false return $retval fi else echo " mysqld process is not exist." return 2 fi else echo "$mysqld_pid_file_path is not exist,or mysqld does not startup." fi } case "$1" in start) start retval=$? ;; stop) stop retval=$? ;; restart) stop sleep 2 start retval=$? ;; *) echo "usage:$0 {start|stop|restart}" exit 1 esac exit $retval
path=/backup mysql="mysql -uroot -poldboy123" mysqldump="mysqldump -uroot -poldboy123" [ -d $path ]||mkdir $path -p for dbname in `$mysql -e "show databases;" 2>/dev/null|grep -v _schema|sed 1d` do $mysqldump -B $dbname|gzip >$path/${dbname}_$(date +%F).sql.gz 2>/dev/null done
path=/backup mysql="mysql -uroot -poldboy123" mysqldump="mysqldump -uroot -poldboy123" [ -d $path ]||mkdir $path -p for dbname in `$mysql -e "show databases;" 2>/dev/null|grep -v _schema|sed 1d` do for tname in `$mysql -e "show tables from $dbname;" 2>/dev/null|sed 1d` do $mysqldump $dbname $tname|gzip 1>$path/${dbname}_${tname}.sql.gz 2>/dev/null done done
path=/backup [ -d $path ]||mkdir $path -p for dbname in `mysql -e "show databases;"|grep -v _schema|sed 1d` do for tname in `mysql -e "show tables from $dbname;"|sed 1d` do if [ "$dbname" = "mysql" ] then mysqldump --skip-lock-tables $dbname $tname|gzip >$path/${dbname}-${tname}.sql.gz else mysqldump $dbname $tname|gzip >$path/${dbname}-${tname}.sql.gz fi done done
for n in {1..254} do { if `ping -c 1 -w 3 10.0.0.$n &>/dev/null` then echo "10.0.0.$n is up." else echo "10.0.0.$n is down" fi } & done # -w deadline # -c 次数
# 随机数生成
$((RANDOM)) 0-32767
openssl rand -base64 10
uuidgen
head /dev/urandom|cksum
cat /proc/sys/kernel/random/uuid
date +%s%N
mkpasswd -l 20 -d 10 -C 5 -c 3 -s 2
-l 长度
-d 数字
-c 小写字母
-C 大写字母
-s 特殊字符
. /etc/init.d/functions if [ $UID -ne 0 ] then echo "必须用root执行本脚本" exit 1 fi for n in {23..29} do pass=`openssl rand -base64 10` if [ `grep -w "oldboy$n" /etc/passwd|wc -l` -eq 0 ] then useradd oldboy$n &>/dev/null &&\ echo $pass|passwd --stdin oldboy$n &>/dev/null &&\ echo -e "oldboy$n\t$pass" >>/tmp/user.list &&\ action "oldboy$n is successful." /bin/true else action "oldboy$n is exist." /bin/false fi done
# RANDOM随机数---> md5 --->截取子串 --->找出初始MD5串
array=( 21029299 00205d1c a3da1677 1f6d12dd 890684b ) Funmd5(){ for n in {0..32767} do echo -e "$n\t`echo $n|md5sum`" >>/tmp/md5sum1.log & done } FunJudge(){ char=`echo ${array[*]}|tr ' ' '|'` egrep "$char" /tmp/md5sum1.log } main(){ Funmd5 FunJudge } main
awk '{S[$1]++}END{for(key in S) print S[key],key}' access_2010-12-8.log|sort -rn|head >/tmp/ip.log while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` if [ $count -gt 100 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ] then iptables -I INPUT -s $ip -j DROP &&\ echo "$ip" >>/tmp/drop.log else echo "$ip" >>/tmp/accept.log fi done</tmp/ip.log
awk '/ESTAB/{print $0}' netstat.log |awk -F "[ :]+" '{print $(NF-3)}'|sort|uniq -c|sort -rn|head >/tmp/ip.log while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` if [ $count -gt 10 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ] then iptables -I INPUT -s $ip -j DROP &&\ echo "$ip" >>/tmp/drop.log else echo "$ip" >>/tmp/accept.log fi done</tmp/ip.log
awk '{S[$1]++}END{for(key in S) print S[key],key}' access_2010-12-8.log|sort -rn|head >/tmp/ip.log while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` if [ $count -gt 100 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ] then iptables -I INPUT -s $ip -j DROP &&\ echo "$ip" >>/tmp/drop.log else echo "$ip" >>/tmp/accept.log fi done</tmp/ip.log
#!/bin/bash for i in I am oldboy teacher welcome to oldboy training class do if [ "${#i}" -le 6 ];then echo $i fi done


浙公网安备 33010602011771号