shell函数库
1 #!/bin/bash 2 #在开始写脚本的时候,务必加上环境变量 3 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 4 #函数库类型 5 6 #log记录函数 7 delLog=/tmp/del.log 8 log() 9 { 10 echo "$(date +"%F %T") $*" >> $delLog 11 } 12 #循环gamexx的数字xx 13 gamexx() 14 { 15 GAMES=`ls /data |sed -ne '/^game/s/^game//p' |grep -v -w root |grep -v test` 16 /bin/rm /root/aa 2> /dev/null 17 echo 18 for GAMESERVER in $GAMES 19 do 20 echo $GAMESERVER 21 done 22 } 23 #删除文件xx天前的文件 24 del_file() 25 { 26 local rev 27 find / -mtime +30 -name xx.file -exec rm -f {} \; 28 rev=$? 29 if [[ $rev -eq 0 ]];then 30 return $rev 31 else 32 log "写日志" 33 fi 34 } 35 #直接获取脚本的名字,不需要路径 36 fun_basename() 37 { 38 echo "Usage: `basename $0` [domain-name]" 39 basename /dev/shb ====>得到shb 40 } 41 #ip逆序输出,IFS的应用 42 ip_reverse() 43 { 44 IP=220.112.253.111 45 echo $IP 46 IFS="." 47 TMPIP=$(echo $IP) 48 #echo $TMPIP 49 IFS=" " # space 50 #echo $TMPIP 51 for x in $TMPIP 52 do 53 Xip="${x}.$Xip" 54 done 55 echo ${Xip%.} 56 } 57 #判断命令是否执行成功,一旦有一个不成功就会返回1 58 set_use1() 59 { 60 set -o pipefail 61 ls sss;cd /root/ 62 result=$? 63 echo $result 64 set +o pipefail 65 } 66 #调试程序的执行过程,在屏幕上输出,相当于sh -x 67 set_debug() 68 { 69 set -x 70 ls xxx 71 echo "457" 72 sey +x 73 } 74 #多进程实现 75 more_process() 76 { 77 trap "exec 1000>&-;exec 1000<&-;exit 0" 2 78 #"exec 1000>&-;exec 1000<&1000-"这个是关闭文件操作符1000的意思,后面的2指的是ctrl+C的操作 79 #也就是将文件处于一个初始化的状态 80 mkfifo testfifo #建立管道文件 81 exec 1000<>testfifo #exec 1000<>testfifo指的是把文件操作符1000与testfifo绑定的意思,对1000的操作>既是对testfifo的操作 82 rm -fr testfifo #用完管道文件就要删除 83 for ((n=1;n<=10;n++)) #多进程说白了就是大shell里面套一个小shell,而这个小shell就是进程数,这里进程>数是10 84 do 85 echo >&1000 #将“空白”输入到1000文件操作符即输入到testfifo里 86 done #管道读取是以行为单位的,所以要输入行而不是字 87 start=$(date) #显示一下当前时间 88 echo $start 89 for ((i=1;i<=50;i++)) #这个是正式的任务,一共有50项,上面定了10进程数,所以每次完成5个任务。 90 do 91 read -u1000 92 #通过read -u把大小shell连接起来,一次读取1000里的一个空行,全部读取完毕之后,没有其他空行了,任务就停止了 93 { 94 echo sucess$i;sleep 5 95 echo >&1000 96 }& 97 done 98 wait 99 end=$(date) #再显示一下当前时间,计算一下时间差 100 echo $end 101 exec 1000>&-;exec 1000<&- #和第一句遥相呼应 102 #参考链接 103 #http://chenx1242.blog.51cto.com/10430133/1757325 104 #http://blog.csdn.net/liuxiangke0210/article/details/65948522 105 } 106 #参数的判断 107 #$*所有参数 108 #$#参数个数 109 psttern_number() 110 { 111 if [ "$*" == "" ] 112 then 113 echo "Usage: $0 hostname copy_agent_number agent_id_number" 114 echo "EXAMPLE:" 115 echo "\t$0 mac15v 4 9000\n" 116 exit 117 fi 118 } 119 #自动登录 120 expect() 121 { 122 command="sudo rsync -av --progress --exclude-from=$File_Catalog/exclude.list $Username@$Ip:$dst $src" 123 expect -c " 124 spawn $command; 125 expect { 126 "Password:" {send $Passwd\r;exp_continue} 127 "Password:" {send $Passwd\r} 128 } 129 interact 130 " 131 #对于简单的这样也可以 132 echo "passwd"|sudo -S command 133 } 134 #while循环读取文件 135 while_line() 136 { 137 #读取多个文件3,5是文件句柄 138 while read -u 3 pattern1;read -u 5 pattern2 139 do 140 command1 141 echo $pattern1,pattern2 142 143 done 3<test.txt 5<test2.txt 144 do 145 } 146 hostname_get() 147 { 148 HOST=${HOSTNAME%%.*} 149 } 150 151 #变量的赋值以及判断是否存在输出颜色 152 pattern_xx() 153 { 154 varname=${varname:-word} 155 eg 156 #varname=12 157 varname=${varname:-80} 158 echo $varname 159 #输出颜色 160 echo -e "\033[31m Unable to get information \033[0m" 161 } 162 163 #case选择语句 164 165 166 case_func() 167 168 { 169 argument=$1 170 case $argument in 171 变量1) 172 command/func 173 ;; 174 m|mem) 175 command/func 176 ;; 177 c|cpu) 178 command/func 179 ;; 180 b|board) 181 command/func 182 ;; 183 n|network) 184 command/func 185 ;; 186 *) 187 command/func 188 189 echo -e "\033[31m ############# END ############# \033[0m" 190 ;; 191 esac 192 } 193 194 #while结合case,getopts来做 195 getopts_fun() 196 { 197 #执行脚本是必须加上参数 sh getopts_fun -i a xxx 198 while getopts "a:" opt 199 #执行脚本时a,b,f后面必须加上参数,cde可以不加参数 sh getopts_fun -i a xxx ,sh getopts_fun -i b 200 while getopts "a:b:cdef" opt 201 #执行脚本时可以不加上参数 202 while getopts ":a:" opt 203 do 204 case $opt in 205 a) 206 echo "this is -a the arg is ! $OPTARG" 207 ;; 208 b) 209 echo "this is -b the arg is ! $OPTARG" 210 ;; 211 c) 212 echo "this is -c the arg is ! $OPTARG" 213 ;; 214 \?) 215 echo "Invalid option: -$OPTARG" 216 ;; 217 esac 218 done 219 } 220 #简略if语句 221 #可以借助||或者&&来做 222 if_simple() 223 { 224 #eg 225 a=4 226 [[ $a -le 6 ]] || echo $a 227 [[ $a -le 6 ]] && echo $a 228 [[ $? -eq 0 ]] && ls 229 } 230 #awk的用法,增加变量 231 awk_fun() 232 { 233 awk '{for(i=1;i<=NF;i+=6)print $i}' file.txt 234 } 235 236 #巧用return返回值 237 checkPing() 238 { 239 if [ 1 == 1 ] 240 then 241 echo "ok" 242 return #返回值是0 243 return 1 #返回值是1 244 } 245 fun_test() 246 { 247 checkPing 248 rev=$? #获取函数返回值 249 echo $rev 250 } 251 252 253 #参数不存在就是用默认的,存在就是用传入的 254 num_3=100 255 num_4=200 #设置的默认参数 256 pattern_fun() 257 { 258 259 local host=$1 260 local ip=$2 261 local warnPackLoss=${3:-$num_3} 262 local criticalPackLoss=${4:-$num4} 263 echo $num_3 264 echo $num_4 265 } 266 #执行的时候不传入参数 267 pattern_fun hk 1.1.1.1 268 #执行的时候传入参数 269 pattern_fun hk 2.2.2.2 10 20 270 271 #ssh远程连接并且执行命令的两种方式 272 ssh_cmd() 273 { 274 ssh -p 22 -l user ip "cat /proc/info"/"脚本"#(脚本是在远程服务器上面的,直接登录到远程服务器是执行了这个脚本,要有可执行权限) 275 ssh -p 22 -l user ip "`cat test.sh`" #(是在本地的服务器上的脚本,但是脚本内容是关于远端服务器的,也就相当于将这个脚本拷贝到远程服务器上面然后执行,结果输出返回,然后退出) 276 #例如 277 ''' 278 脚本如下 279 #/bin/bash 280 dir_num=`ls /home/zhangdianke/test/` 281 for i in $dir_num 282 do 283 echo $i 284 done 285 ''' 286 #以上就是两种远程执行命令的方式 287 } 288 #大小比较,小数与整数 289 #shell不支持小数与整数的直接比较,我们需要曲线救国 290 #利用bc来判断,结果为真,返回1,假返回0 291 float_int_fun() 292 { 293 294 if [ $(echo "1.8 < 15" | bc) == 1 ];then 295 echo "ok" 296 else 297 echo "no" 298 299 } 300 #shell常用的匹配 301 pattern_sub() 302 { 303 ignore_list="bj[0-9]|hk[3-7]|sz1" 304 if [[ $HOSTNAME =~ $ignore_list ]];then 305 command 306 fi 307 } 308 309 #let简单使用 310 var=1 311 let "var += 5" 312 let "sum=2 ** 3" 313 let "n++" 314 #取值是最后一个 315 let "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 - 4, d = 19 -3))" 316 echo $t1 #t1=16 317 let "b32 = 32#77" #32进制77转化成10进制 echo $b32
引入另外脚本的变量只需要在另外的脚本里面申明引入的脚本即可
source xxx.sh
这样xxx.sh里面的变量就可以在另外一个脚本里面使用
查看链接文件的绝对路径 lrwxrwxrwx 1 root root 13 Jun 12 13:50 test_ce.sh -> /root/test.sh 脚本如下 cat test_ce.sh PRG="$0" while [ -h "$PRG" ]; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi done echo $PRG 输出 /root/test.sh
expect自动登录
1 #!/usr/bin/expect -f 2 3 set ipaddress [lindex $argv 0] 4 5 set passwd [lindex $argv 1] 6 7 set timeout 30 8 9 10 #登入操作 11 spawn ssh root@$ipaddress 12 13 expect { 14 15 "yes/no" { send "yes\r";exp_continue } 16 17 "password:" { send "$passwd\r" } 18 19 } 20 expect "*from*" 21 send "useradd suixun\r" 22 #send "mkdir -p /home/suixuncon/.ssh/\r" 23 #send "cat /tmp/id_rsa.pub >> /home/suixuncon/.ssh/authorized_keys\r" 24 25 expect "#" 26 #send "echo 'pwd@)!&' | passwd --stdin suixun" 27 28 #expect "$" 29 #send "su - suixuncon\r" 30 31 #expect "$" 32 #send "mkdir -p /home/suixuncon/.ssh/\r" 33 34 #expect "$" 35 #send "cat /tmp/id_rsa.pub >> /home/suixuncon/.ssh/authorized_keys\r" 36 37 #send "exit\r" 38 39 #expect "$" 40 #interact
let "t3 = (( b = 2,14 / 2 ))" #t3=7,b=2

浙公网安备 33010602011771号