shell基础知识总结
把懂的一点shell知识,汇总一下,以便自己以后学习,查找~ shell引号:
位置变量: $# 获取当前执行的shell脚本后面接的参数的总个数 $0 获取当前执行的shell脚本的文件名,如果执行脚本带路径,那么就包括脚本路径 $n 获取当前执行的shell脚本的第n个参数值,当n大于10时,需要用大括号括起来${10},参数以空格隔开 进程状态变量 $$ 获取当前shell脚本的进程号(PID) $! 执行上一个指令的PID $? 获取执行上一个指令的返回值(0 位成功,非零为失败) #!/bin/sh #no1 if [ $# -ne 1 ] then echo "USAGE:/data/3306/$0 {start|stop}" exit 1 fi #no2 if [ "$1" == "start" ] then /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf 2>&1 > /dev/null & exit 0 fi #no3 if [ "$1" == "stop" ] then mysqladmin -u root -poldboy123 -S /data/3306/mysql.sock shutdown exit 0 fi #!/bin/sh #no.1judgeargnums. [$#-ne2]&&{ echo"USAGE:"$0"num1num2" exit1 } #no.2judgeifint. expr$1+$2&>/dev/null [$?-ne0]&&{ echo"plsinputtwonums:" exit2 } #no.3comparetwoint. [$1-lt$2]&&{ echo"$1<$2" exit0 } [$1-eq$2]&&{ echo"$1=$2" exit0 } [$1-gt$2]&&{ echo"$1>$2" exit0 } #!/bin/bash a=$1 b=$2 echo"a-b=$(($a-$b))" echo"a+b=$(($a+$b))" echo"a*b=$(($a*$b))" echo"a/b=$(($a/$b))" echo"a**b=$(($a**$b))" echo"a%b=$(($a%$b))" 逻辑操作符
二元比较操作符
=和!= 也可在[] 中使用,但在[]中使用包含>和<的符号时,需要用反斜线转义,不转义结果可能有误 三种计算字符长度的方法: [root@zabbix ~]# John="I am John" [root@zabbix ~]# expr length "$John" 9 [root@zabbix ~]# echo $John|wc -L 9 [root@zabbix ~]# echo ${#John} 9 例1: for n in I am John welcome to ucloudlink do if [ ${#n} -lt 6 ] then echo $n fi done 比较三种方法的效率: [root@zabbix ~]# chars=`seq -s " " 100` [root@zabbix ~]# echo $chars 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [root@zabbix ~]# echo ${#chars} 291 [root@zabbix ~]# echo $(expr length "$chars") 291 [root@zabbix ~]# echo ${chars} |wc -L 291 [root@zabbix ~]# time for i in $(seq 1111); do count=`echo ${chars} |wc -L`;done; real 0m2.775s user 0m0.734s sys 0m1.657s [root@zabbix ~]# time for i in $(seq 1111); do count=`echo $(expr length "$chars")`;done; real 0m3.511s user 0m0.726s sys 0m1.797s [root@zabbix ~]# time for i in $(seq 1111); do count=${#chars};done; real 0m0.158s user 0m0.152s sys 0m0.001s 结论:管道效率低 替换:
变量替换表:
expr只能进行整数运算 [root@zabbix ~]# cat judge_int.sh read -p "Pls input:" a expr $a + 1 &>/dev/null [ $? -eq 0 ] && echo int || echo chars awk也可以计算小数 [root@zabbix ~]# echo "5.5 5.6"|awk '{print ($2-$1)/5}' 0.02 bc既能计算整数,又能计算小数 [root@zabbix ~]# echo "`seq -s '+' 10`="$((`seq -s "+" 10`)) 1+2+3+4+5+6+7+8+9+10=55
整数比较,推荐下面方法: [ $num1 -eq $num2 ] <<注意空格 (($num1>$num2))<<无需空格 read -p "提示" -t 超时 特殊写法: if [ -f "$file1" ];then echo 1; fi相当于:[ -f "$fil1" ]&& echo 1 if [ -f "$file1" ] then echo 1 fi grep精确过滤 [root@zabbix ~]# cat John.log 200 0200 2000 [root@zabbix ~]# grep "b200b" John.log 200 [root@zabbix ~]# grep -w "200" John.log 200 [root@zabbix ~]# grep -x "200" John.log 200 [root@zabbix ~]# grep "^200$" John.log 200 shell输入错误操作,回退: shift + delete ctrl + u
pstree:显示进程状态树 nice:改变优先权 nohup:用户退出系统后任然可以继续工作 pgrep:查找匹配条件的进程 strace:跟踪一个进程的系统调用情况 ltrace:跟踪进程调用库函数的情况 vmstat:报告虚拟内存统计信息 top命令,前五行是系统整体的统计信息,第六行开始为具体的进程统计信息: top - 11:29:28 up 2 days,4:28,1 user,load average: 0.01,0.08,0.03 #同uptime结果,该项显示当前时间(11:29:28),系统运行时间(up 2 days,4:28),当前登录用户数(1 user)最近1分,5分,15分的三个平均负载值(load average: 0.01,0.03) Tasks: 1244 total,1 running,1243 sleeping,0 stopped,0 zombie #processess自最近一次刷新依赖的运行进程总是(1244 total),进程被分为正在运行的(1 running),休眠的(1243 sleeping),停止的(0 stopped),僵尸的(0 zombie) Cpu(s): 1.5%us,0.7%sy,0.0%ni,97.3%id,0.5%wa,0.0%hi,0.0%si,0.0%st #CPU states显示用户(1.5%us),系统(0.7%sy),优先级进程(只有优先级为负的列入考虑)(0.0%ni)闲置(97.3%id),等待(0.5%wa,)等情况所占用CPU的百分比。优先级进程所消耗的时间也被列入到用户和系统的时间中,所以总的百分比将大于100% Mem: 16336324k total,16154176k used,182148k free,184208k buffers #Mem内存使用统计,其中包括总的物理内存总量(16336324k total),已使用的物理内存总量(16154176k used),可用于交换内存(182148k free),用作内存缓存的内存量(184208k buffers) Swap: 8392696k total,5808k used,8386888k free,11161972k cached #swap交换分析统计,其中包括总的交换分区总量(8392696k total)已用交换内存量(5808k used,),可用交换内存(8386888k free),缓存的内存总量(11161972k cached) top命令参数,按TMP1记
扩展:while按行读文件的方式: 方式1: exec <FILE sum=0 while read line do cmd done 方式2: cat ${FILE_PATH} |while read line do cmd done 方式3: while read line do cmd done<FILE 从日志计算访问当天流量大小 sum=0 while read line do value=`echo $line|awk '{print $10}'` expr $value +1 &>/dev/null [ $? -ne 0 ] && continue ((sum+=value)) done<access_2010-12-8.log echo $sum while循环: 1、while循环的特长是执行守护进程以及我们希望循环不退出持续执行的情况,用于频率小于1分钟循环处理(crond),其他的while循环几乎都可以被for循环替代 2、case语句可以用if语句替换,一般在系统启动脚本传入少量固定规则字符串,用case语句,其他普通判断用if 3、一句话,if,for语句最常用,其次while(守护进程),case(服务启动脚本) 直接列出变量列表所有元素,打印5、4、3、2、1 需要空格隔开 for num in 5 4 3 2 1 do echo $num done for ip in 10.0.0.18 10.0.0.19 do echo $ip done for num in `seq 10` for num in {1..10} for file in `ls` do if [ -d $file ];tthen echo "this is $file fir" else echo "this is $file file" fi done for 循环批量改名,三种方法: ls *.jpg|awk -F "_finished" '{print "mv "$0" " $1$2}'|bash mv $file `echo $file|sed 's#_finished##g'` mv $file `echo $file|cut -d . -f1`.jpg rename "_finished" "" *.jpg 9 9 乘法表
[root@zabbix ~]# cat 1-9.sh for a in `seq 1 9` do for b in `seq 1 9` do if [ $a -ge $b ] then echo -en "$a x $b = $(expr $a * $b) " fi done echo " " done [root@zabbix ~]# sh 1-9.sh 1 x 1 = 1 2 x 1 = 2 2 x 2 = 4 3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81 分库备份 mysql -uroot -pJohn123 -S /data/3306/mysql.sock -e 'show databases;'|sed '1d'|grep -v "_schema" [root@zabbix ~]# vim bak_by_db.sh #!/bin/sh MYUSER=root MYPASS=John123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUER -p$MYPASS -S $SOCKET" BAKPATH="/server/backup/$(date +%F)" [ ! -d $BAKPATH ] && mkdir -p $BAKPATH for dbname in `$MYCMD -e 'show databases;'|sed '1d'|grep -v "_schema"` do $MYDUMP -B -x --events $dbname|gzip >$BAKPATH/${dbname}.sql.gz if [ $? -eq 0 ];then echo "$dbname" >>$BAKPATH/${dbname}.log fi done 分库分表备份: [root@zabbix ~]# cat bak_by_db.sh #!/bin/sh MYUSER=root MYPASS=John123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUER -p$MYPASS -S $SOCKET" BAKPATH="/server/backup/$(date +%F)" [ ! -d $BAKPATH ] && mkdir -p $BAKPATH for dbname in `$MYCMD -e 'show databases;'|sed '1d'|grep -v "_schema"` do for tname in `$MYCMD -e "show tables from $dbname;"|sed 1d` do $MYDUMP -x --events $dbname $tname|gzip >$BAKPATH/${dbname}_${tname}.sql.gz if [ $? -eq 0 ];then echo "${dbname}_${tname}" >>$BAKPATH/${dbname}.log fi done done 文件改名: [root@zabbix ~]# cat k2.sh cd /home for n in `ls *.html` do mv $n `echo $n|sed -r 's#^o.*y(.*)html+linux1HTML#g'` done 自定义生成用户,密码 for n in `seq -2 10` do pass=`echo $RANDOM|md5sum|cut -c 2-9` useradd oldboy$n && echo $pass|passwd --stdin oldboy$n echo -e "oldboy$n t $pass" >> /tmp/user.log done 获取随机数方法: echo $RANDOM RANDOM范围0-32767 echo "$RANDOM oldboy"|md5sum openssl rand -base64 65|cut -c 30-40 时间序列 date +$s%N head /dev/urandom|cksum cat /proc/sys/kernel/random/uuid yum install expect -y mkpasswd -1 8 chpasswd批量生成用户密码 1.log liuxia:12345 lixiang:19876 chpasswd <1.log 用户必须存在
数组: [root@zabbix ~]# array=(1 2 3) [root@zabbix ~]# echo ${#array[@]} 3 [root@zabbix ~]# echo ${#array[*]} 3 [root@zabbix ~]# echo ${array[0]} 1 [root@zabbix ~]# echo ${array[1]} 2 [root@zabbix ~]# echo ${array[2]} 3 [root@zabbix ~]# vim 1.sh array=(1 2 3) for ((i=0;i<${#array[*]};i++)) do echo ${array[i]} done echo =================== for i in ${array[*]} do echo $i done 数组增删 [root@zabbix ~]# echo ${array[@]} 1 2 3 [root@zabbix ~]# array[3]=4 [root@zabbix ~]# echo ${array[@]} 1 2 3 4 [root@zabbix ~]# unset array[2] [root@zabbix ~]# echo ${array[@]} 1 2 4 数组定义: 静态数组array=(1 2 3) 动态数组array=($(ls)) 打印: ${array[@]}或${array[*]} 打印所有元素 ${#array[@]}或${#array[*]}打印数组长度 ${array[i]} 打印单个元素,i是数组下标。 函数: #!/bin/bash lili 检查网站状态 functioncheck_url(){ wget--spider-q-o/dev/null--tries=1-T5$1 if[$?-eq0] then echo"$1isyes." else echo"$1isno." fi } 字体颜色 #!/bin/sh echo-e"$YELLOW_COLORLili$RES" #!/bin/sh add(){ RED_COLOR='E[1;31m' GREEN_COLOR='E[1;32m' YELLOW_COLOR='E[1;33m' BLUE_COLOR='E[1;34m' FLASH_COLOR='33[5m' RES='E[0m' case"$1"in red|RED) echo-e"$RED_COLOR$2$RES" ;; green|GREEN) echo-e"$GREEN_COLOR$2$RES" ;; yellow|YELLOW) echo-e"$YELLOW_COLOR$2$RES" ;; blue|BLUE) echo-e"$BLUE_COLOR$2$RES" ;; *) echo"pluuse:{red|green|yellow|blue}{chars}" exit esac } menu(){ cat<<END ================= 1.apple 2.pear 3.banana 4.cherry 5.exit ================== END } fruit(){ read-p"plsinputthefruityourlike:"fruit case"$fruit"in 1) addredapple ;; 2) addgreenpear ;; 3) addyellowbanana ;; 4) addbluecherry ;; 5) exit ;; *) echo"plsselectrightnum:{1|2|3|4}" exit esac } main(){ whiletrue do menu fruit done } main 读取输入内容: #!/bin/sh read-t5-p"Plsinputacharacter:"a echo"yourinputis:$a" read-p"Pleaseinputanumber:"ans case"$ans"in 1) echo"thenumyouinputis1" ;; 2) echo"thenumyouinputis2" ;; [3-9]) echo"thenumyouinputis$ans" ;; *) echo"thenumyouinputmustbeless9." exit; esac #!/bin/sh #no.1menu cat<<EOF 1.[installlamp] 2.[installlnmp] 3.[exit] EOF #no.2 read-t20-p"plsinputthenumyouwant:"num ["$num"!="1"-a"$num"!="2"-a"$num"!="3"]&&{ echo"Inputerror" exit } #no.3 [$num-eq1]&&{ echo"installlamp" [-f/server/scripts/lamp.sh]&& /bin/sh/server/scripts/lamp.sh exit } [$num-eq2]&&{ echo"installlnmp" [-f/server/scripts/lnmp.sh]&& /bin/sh/server/scripts/lnmp.sh exit } [$num-eq3]&&{ echo"bye!" exit } read-p"Plsinput:"a expr$a+1&>/dev/null [$?-eq0]&&echoint||echochars
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |