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
View Code

 

let "t3 = (( b = 2,14 / 2 ))"  #t3=7,b=2

 

posted @ 2017-06-12 14:55  Dicky_Zhang  阅读(287)  评论(0)    收藏  举报