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=$'\n'
	OLD_IFS=$IFS
	IFS=$'\n'
	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%%\r" $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\r" 
	expect "*]#" 
	send "ifconfig\r" 
	expect "*]#" 
	send "exit\r" 
	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
posted @ 2019-04-22 11:16  吕涵之  阅读(293)  评论(0编辑  收藏  举报