zoukankan      html  css  js  c++  java
  • shell笔记

    ############################################################
    # $Name: nginx_status.sh
    # $Version: v1.0
    # $Function: Nginx Status
    # $Author: lvhanzhi
    # $organization: www.lvhanzhi.xyz
    # $Create Date: 2016-06-23
    # $Description: Monitor Nginx Service Status
    ############################################################

    1.shell是命令解释器
    2.shell脚本=规范+语法+系统命令
    3.shell脚本能做什么
    	减少重复性、周期性的工作。
    	减少故障的几率。
    4.解释器	#!/bin/bash
    	#!/bin/bash
    	脚本中如果不写,在执行过程中如果./方式执行(需要权限),默认调用bash命令翻译该文件
    	脚本中如果写了使用什么解释器翻译,那在使用./时则会调用对应的解释器执行
    5.执行方式
    	bash /tmp/test -->直接使用解释器器执行脚本,无需执行权限 
    	./test.sh -->以./运行的方式执行,需要拥有执行权限
    6.变量
    	变量怎么定义
    		自定义	规范,命名  变量引用${} 
    		系统定义
    		预定义变量	$$ $# $@ $* $? 
    		位置参数变量,执行脚本后面的参数,比如  /etc/init.d/network start 
    	${#变量名} 统计变量长度
    	set 用来显示本地变量
    	env 用来显示环境变量
    	export 用来显示和设置环境变量
    	unset xxx 取消变量xxx
    	[root@centos7 ~]# var="hello world" #定义变量
    	[root@centos7 ~]# echo $var #输出变量
    	hello world
    	[root@centos7 ~]# echo ${var}_aaa 
    	hello world_aaa
    	[root@centos7 ~]# echo "$var $00" #转义
    	hello world $00
    7.传参
    	[root@centos7 shell01]# vim variable.sh      [root@centos7 shell01]# bash variable.sh 1 2 3          
    	#!/bin/bash                                  
    	echo "#当前shell脚本的文件名: $0"           #当前shell脚本的文件名: variable.sh
    	echo "#第1个shell脚本位置参数:$1"           #第1个shell脚本位置参数:1
    	echo "#第2个shell脚本位置参数:$2"           #第2个shell脚本位置参数:2
    	echo "#第3个shell脚本位置参数:$3"           #第3个shell脚本位置参数:3
    	echo "#所有传递的位置参数是: $*"             #所有传递的位置参数是: 1 2 3
    	echo "#所有传递的位置参数是: $@"             #所有传递的位置参数是: 1 2 3
    	echo "#总共传递的参数个数是: $#"             #总共传递的参数个数是: 3
    	echo "#当前程序运行的 PID 是: $$"            #当前程序运行的 PID 是: 22685
    	echo "#上一个命令执行的返回结果: $?"         #上一个命令执行的返回结果: 0
    	$*和$@的区别:加引号$*以行的形式显示,$@以列的形式显示
    	$n,n为10或10以上要加{},${10}
    8.计算echo "$(($(date +%Y)+1))"
    	[root@centos7 shell01]# echo $(find -name "*.sh")
    	./env.sh ./variable.sh
    9.交互 read -p "是否确认此操作[y/n]:" read_change
    10.变量的替换
    	1.从前往后删除变量内容
    	[root@bgx ~]# url=www.sina.com.cn   #定义变量
    	[root@bgx ~]# echo ${url}           #输出变量的值
    	www.sina.com.cn
    	[root@bgx ~]# echo ${url#*.}    #从前往后,最短匹配
    	sina.com.cn
    	[root@bgx ~]# echo ${url##*.}   #从前往后,最长匹配
    	cn
    	2.从后往前删除变量内容
    	[root@bgx ~]# url=www.sina.com.cn   #定义变量
    	[root@bgx ~]# echo ${url}           #输出变量结果
    	www.sina.com.cn
    	[root@bgx ~]# echo ${url%.*}        #从后往前,最短匹配
    	www.sina.com
    	[root@bgx ~]# echo ${url%%.*}       #从后往前,最长匹配 贪婪匹配
    	www
    	3.变量内容替换
    	[root@m01 shell01]# echo ${url}
    	www.sina.com.cn
    	[root@m01 shell01]# echo ${url/n/N}
    	www.siNa.com.cn
    	[root@m01 shell01]# echo ${url//n/N}
    	www.siNa.com.cN
    11.整数运算  expr $(()) $[]   +-*/%
    	expr 
    		[root@centos7 ~]# n1=10
    		[root@centos7 ~]# n2=20
    		[root@centos7 ~]# expr $n1 + $n2
    		30
    		[root@centos7 ~]# expr $n1+$n2
    		10+20
    		[root@centos7 ~]# expr $n1 * $n2
    		expr: syntax error
    		[root@centos7 ~]# expr $n1 * $n2
    		200
    	$(())
    		[root@centos7 ~]# echo $(( $n1 * $n2 ))
    		-bash: 10 * 20 : syntax error: invalid arithmetic operator (error token is "* 20 ")
    		[root@centos7 ~]# echo $(( $n1 * $n2 ))
    		200
    		[root@centos7 ~]# echo $(( $n1*$n2 ))
    		200
    	$[]
    		[root@centos7 ~]# echo $[$n1 * $n2]
    		200
    		[root@centos7 ~]# echo $[$n1*$n2]
    		200
    		[root@centos7 ~]# echo $[$n1*$n2]
    		-bash: 10*20: syntax error: invalid arithmetic operator (error token is "*20")
    12.小数运算bc awk
    	[root@bgx shell]# yum install bc -y
    	[root@bgx shell]# echo "2*4" |bc
    	8
    	[root@bgx shell]# echo "2^4" |bc
    	16
    	[root@bgx shell]# echo "scale=2;6/4" |bc    #取2位小数
    	1.50
    	[root@bgx shell]# awk 'BEGIN{print 1/2}'
    	0.5
    13.if
    	if [ $1x == "ab"x ]; then
    		echo "you had enter ab"
    	elif [ $1x == "cd"x ]; then		
    		echo "you had enter cd"
    	else
    		echo "you had enter unexpected word"
    	fi
    	-eq =、-ne !=、-gt >、-ge >=、-lt <、-le <=
    	if grep 'aaa' /etc/passwd;then
    		echo ok
    	else
    		echo error
    	fi
    	if文件比对方式
    		参数	说明	示例
    		-e	如果文件或目录存在则为真					[ -e file ]
    		-s	如果文件存在且至少有一个字符则为真			[ -s file ]
    		-d	如果文件存在且为目录则为真					[ -d file ]
    		-f	如果文件存在且为普通文件则为真				[ -s file ]
    		-r	如果文件存在且可读则为真					[ -r file ]
    		-w	如果文件存在且可写则为真					[ -w file ]
    		-x	如果文件存在且可执行则为真					[ -x file ]
    		if [ -e /etc/hostss ];then
    		echo "ok"
    		else
    			echo "err"
    		fi
    		[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目录不存在"
    	if字符串比较
    		参数			说明						示例
    		==				等于则条件为真				[ "$a" == "$b" ]
    		!=				不相等则条件为真			[ "$a" != "$b" ]
    		-z				字符串的长度为零则为真		[ -z "$a" ]			#没有内容为真
    		-n				字符串的长度不为空则为真	[ -n "$a" ]			#有内容则为真
    		str1 > str2		str1大于str2为真			[ str1 > str2 ]
    		str1 < str2		str1小于str2为真			[ str1 < str2 ]
    	多条件判断
    		-a 并且	[ 1 -lt 2 -a 2 -gt 1 ];echo $?
    		-o 或者
    		[[]]使用正则 ||或 &&并且,不能用-a [[ 1 -lt 2 && 2 -gt 1 ]];echo $?
    		[ 1 -lt 2 ] && [ 2 -gt 1 ] 
    	正则匹配
    		[[ "$num" =~ ^[0-9] ]];echo $?
    	小数比较
    		[ 1.5 > 2 ] && echo $? || echo $?
    	判断是否为整数
    		方式一:
    			[root@centos7 ~]# a=1
    			[root@centos7 ~]# expr $a + 1 &>/dev/null  && echo $? || echo $?
    			0
    			[root@centos7 ~]# a=1.1
    			[root@centos7 ~]# expr $a + 1 &>/dev/null  && echo $? || echo $?
    			2
    			[root@centos7 ~]# a="hello world"
    			[root@centos7 ~]# expr $a + 1 &>/dev/null  && echo $? || echo $?
    			2
    		方式二:
    			if [[ $name_end =~ ^[0-9]+$ ]];then
    					echo "是整数"
    			else
    					echo "不是整数"
    			fi
    case
    	case "变量" in
    		"变量1"|1)
    			;; 
    		"变量2")
    		  ;; 
    		*)
    		   ;;
    	esac
    输出颜色[ok]
    	[root@centos7 scripts]# vim daemon.sh
    	#!/bin/bash
    	source /etc/init.d/functions
    	action "true" /bin/true
    	action "false" /bin/false
    	[root@centos7 scripts]# sh daemon.sh 
    	true                                                       [  OK  ]
    	false                                                      [FAILED]
    
    for循环:
    	for ((i=1; i<=100; i++))
    	do
    		echo $i
    	done
    
    	for i in {1..100}
    	do
    		echo $i
    	done
    
    	for i `seq 1 100`
    	do
    		echo $i
    	done
    	for line in `cat all_db_name.txt`
    	do
    	 mysqldump -uroot -p123 -B $line >/tmp/${line}.sql
    	done
    	#!/usr/bin/bash
    	for (( a=1,b=9;a<10;a++,b-- ))
    	do
    		echo num is $a $b
    	done
    
    for循环自定义分隔符 IFS=$'
    '
    	OLD_IFS=$IFS
    	IFS=$'
    '
    	for i
    	do
    	done
    	IFS=$OLD_IFS
    	for i in
    
    let a--
    
    进度条
    	#!/bin/sh
    	b=''
    	for ((i=0;$i<=100;i+=2))
    	do
    			printf "progress:[%-50s]%d%%
    " $b $i
    			sleep 0.1
    			b=#$b
    	done
    	echo
    
    并发 {代码} &  等待进程结束再往后执行wait
    let i++
    echo * #输出当前文件的所有文件
    while默认按行取值
    	[root@centos7 scripts]# vim a.txt
    	aaa1
    	aaa2
    	aaa3
    	[root@centos7 scripts]# vim test.sh 
    	#!/bin/bash
    	while read line
    	do
    		echo $line
    	done<a.txt
    
    continue|break|exit
    	1.exit,当脚本碰到exit时,直接退出,剩余不管有多少代码都不执行。
    	2.break,结束当前循环,但会执行循环之后的所有的代码。
    	3.continue 忽略本次循环剩余的所有代码,直接进行下一次循环,直到循环结束,然后继续循环之后的代码。
    #!/usr/bin/expect
    	#!/usr/bin/expect 
    	spawn /usr/bin/ssh root@192.168.1.1
    	expect "*password:" 
    	send "123456
    " 
    	expect "*]#" 
    	send "ifconfig
    " 
    	expect "*]#" 
    	send "exit
    " 
    	expect eof
    数组
    	list=(linux shell nginx test)
    	echo ${list[2]}
    	echo ${list[*]}
    	echo ${list[@]}
    	echo ${!list[*]}  #输出全部的下标
    	echo ${#list[*]}  #统计个数
    	unset list	#删除变量
    	list[0]="root"
    	list=(1 2 3 [10]=10)
    	declare -A dic	#申明关联数组
    	dic=([name]=lhz [age]=18)
    	declare -a #查看普通数组
    	declare -A #查看关联数组
    数组统计
    	#!/usr/bin/bash
    	declare -A info_sex
    	while read line
    	do
    		type=$(echo $line|awk -F "/" '{print $NF}')
    		let info_sex[$type]++
    	done</etc/passwd
    	for i in ${!info_sex[@]}
    	do
    		echo 索引的名称:$i 索引对应次数: ${info_sex[$i]}
    	done
    函数
    	函数名(){}
    	function 函数名 { $1 $* } #$*会一次性再输出全部的
    		函数名 a b c
    	rc=$(函数名 a b c)
    	echo $rc #输出 a b c
    	return只能返回1-255的整数
    		#!/bin/bash
    		game(){
    			if [ $1 -gt 0 -a $1 -lt 10 ];then
    				return 0
    			else 
    				return 3
    			fi
    		}
    		game $1
    		echo $?
    
    
    用shell处理以下内容
    1、按单词出现频率降序排序!
    2、按字母出现频率降序排序!
    the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation
    
    #方法一:sort排序-->单词
    [root@oldboyedu shell08]# echo "the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"|sed 's#[.,]# #g'|xargs -n1|sort |uniq -c |sort -nr
    
    #方法一:sort排序-->字母
    [root@oldboyedu shell08]# echo "the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"|sed 's#[.,]# #g'|grep -o '[a-Z]'|sort |uniq -c|sort -nr
    
    
    #方法二:awk排序-->字母
    [root@oldboyedu shell08]#  echo "the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"|grep -o '[a-Z]'|awk '{code[$1]++} END { for (i in code) print code[i],i}'|sort -nr
    
    #方法二:awk排序-->单词
    [root@oldboyedu shell08]#  echo "the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"|sed 's#[.,]# #g'|xargs -n1|awk '{code[$1]++} END { for (i in code) print code[i],i}'|sort -nr
    
    
    #方法三:shell数组排序-->字母
    [root@oldboyedu shell08]#  cat 09.sh 
    #!/usr/bin/bash
    declare -A array_txt
    
    txt="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"
    txt=$(echo $txt |sed 's#[.,]# #g')
    
    for i in $txt
    do
    	let array_txt[$i]++
    done
    
    	#2.遍历数组
    for j in ${!array_txt[@]}
    do
    	echo 次数是: "${array_txt[$j]}" "索引$j"
    done
    
    #方法三:awk排序-->单词
    [root@oldboyedu shell08]# cat 10.sh 
    #!/usr/bin/bash
    declare -A array_txt
    
    te (){
    txt="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"
    txt=$(echo $txt |grep -o "[a-Z]")
    
    for i in $txt
    do
    	let array_txt[$i]++
    done
    
    #2.遍历数组
    for j in ${!array_txt[@]}
    do
    	echo 次数是: "${array_txt[$j]}" "索引$j"
    done
    }
    
    te |sort -t ":" -k 2 -nr
  • 相关阅读:
    ride关键字
    怎么分析《软件需求文档》
    linux系统在线搭建禅道
    用fiddler不能抓取https及证书无法导出
    mybatis There is no getter for property named 'xx' in 'class java.lang.String
    GMT与UTC
    cron表达式详解
    hdu 2083 简易版之最短距离
    hdu 2070 Fibbonacci Number
    hdu 2076 夹角有多大(题目已修改,注意读题)
  • 原文地址:https://www.cnblogs.com/lvhanzhi/p/10749049.html
Copyright © 2011-2022 走看看