shell编程上课笔记(重点:重定向+定时器)

shell是什么

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell是用户与Linux操作系统沟通的桥梁

shell之helloworld

创建:
		后缀为.sh的文件
	编写:
		头部注释为 #!/bin/sh 或者 #!/bin/bash (注释可写可不写,建议写上)
	运行:
		1.通过sh命令执行
			例如:sh helloworld.sh
		2.通过bash命令执行
			例如:bash helloworld.sh
		3.通过把文件修改为可执行的文件然后通过 ./文件命令.sh 来执行	
			例如: ./helloworld.sh (必须在当前目录下)

了解了这些之后我们来编写第一个shell脚本-helloworld
#!/bin/sh
echo "Hello World !"
              
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。

shell中的注释

1. 单行注释
   		众所周知 # , 比如想要注释 echo "Hello World"
		例如:
		[root@Jaking ~]# vim test.sh
		# echo "Hello World"
2. 多行注释:
		方式一
			: << !
			语句1
			语句2
			语句3
			语句4
			!

		方式二(这里是单引号)
			: '
			语句1
			语句2
			语句3
			语句4
			'

变量

定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="runoob.com"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

变量(动态数据类型,没有数据类型的限制,并且必须初始化)
	定义和初始化
		格式
			变量名称=值
		例如:
			x=10 "abc edefg"
		注意:
			等号两边不能有空格
            
	使用:通过$区分变量还是一句话($:引用变量)
		格式1:
			$变量
		格式2:
			${变量}
		注意:
			格式1:会把$后所有相连内容看做一个变量
			格式2:${}表示值引用{}之中的内容,对相连的内容做了一个区分

位置变量

shell中的位置变量等同于Java main(String[] args) 中的方法参数
类似于Java中的可变参数

$0...$n:表示接收外部参数(执行脚本时,传递的参数)
	格式:
		$下标
	注意:
		$0永远表示脚本名称(所以脚本名称不算,$0也不算第一个参数)	
		下标大于一位数只能使用${}获取参数,因为$下标只把第一位数据看做下标
		$*获取所有参数
		$#获取所有参数个数
        
如何在运行脚本的时候传参??
格式:sh 文件名(全名) 变量1 变量2 变量3 ...
	例如:
    	sh pv.sh 1 2 3 4 5 6 7

配置环境变量

之前我们配置环境变量的时候
export JAVA_HOME=/usr/local/soft/...
其中export:表示全局生效

所以我们在shell脚本中使用下面的这行命令
echo ${JAVA_HOME}
也能输出:
/usr/local/soft/...

shell字符串 

引号:
	单引号:按原字符串输出
    	单引号字符串的限制:
		单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
		单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

	双引号:可以引用变量,引用特殊含义的内容
    	双引号里可以有变量
		双引号里可以出现转义字符

	拼接:字符串拼接
    
	注意:
		如果有多个引号,连续的形成一对//例如:"" "" "" "" "" 
		引号中使用其他引号,其他引号做字符串使用//例如:'" '," '"

字符串
	获取长度
		格式:
			${#变量}
	截取:
		格式:
			${变量:开始位置:长度}
		注意:
			${str::5}:从0获取5个
			${str:0}:从0获取到末尾
	替换单个
		格式:
			${变量/旧/新}
		注意:从左向右替换第一个
	替换所有
		格式:
			${变量//旧/新}
	注意:替换不会在原字符上进行修改,想要修改原字符串只能重新赋值

	删除
		从头开始删除
			${变量#表达式}:匹配第一个删除
			${变量##表达式}:匹配最后一个删除
		从尾开始删除
			${变量%表达式}:匹配第一个删除
			${变量%%表达式}:匹配最后一个删除
		注意:从尾开始删除,表达式还是从左向右去写
			删除不会在原字符上进行修改,想要修改原字符串只能重新赋值

shell 基本运算符 

Shell 和其他编程语言一样,支持多种运算符,包括:
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符

	算术运算符
		bash不支持简单的数学运算,可以通过命令实现expr
        (expr 是一款表达式计算工具,使用它能完成表达式的求值操作。)
        (注意使用的是反引号 ` 而不是单引号 ')//反引号在tab上面
		格式1:
			`expr 值 + 值`
			注意:符号两边需要加上空格
		格式2:
			$[值+值]
        
        注意:算术运算符中 * / 不需要转义

	比较运算符: > < >= <=....
		格式:
			$[值符号值](符号两边空格加不加无所谓)
		注意:比较的结果用1(true)和0(false)表示

	逻辑运算符: &/and |/or !/not
		例如:
			#判断2>1结果
			echo $[2 > 1]
			#反转2>1结果
			echo $[!$[2>1]]
			#反转后面的结果2>1 and 2>3  false0
			echo $[!$[$[2>1]&$[2>3]]]
			echo $[2>1 & 2<1]

shell 比较运算符图(涉及到比较不建议用><,结果会出问题)

布尔运算符

逻辑运算符

字符串运算符

shell 流程控制 

if
	格式1:
		if 判断条件
		then
			判断为true执行的代码 
		fi
	格式2:
		if 判断条件
		then
			判断为true执行的代码 
		else
			判断为false执行的代码 
		fi
	格式3:
		if 判断条件
		then
			判断为true执行的代码 
		elif 判断条件
		then
			判断为true执行的代码 
			。。。
		else
			判断为false执行的代码 
		fi
		注意:else可加可不加
判断条件的写法(不建议用><来比较数字--结果会出问题)
	[]:[]两边加空格,符号两边不加空格并且符号前加转义符
    	不适合做大于小于判断(因为是通过ASCII码值来判断的)
		可以使用字母
        例如:[ 1 > 1 ]
	[[]]:[[]]两边加空格,符号两边加空格
		可以使用字母
        例如:[[ x > 60 ]]
	():弃用
	(()):不需要加空格,但是不能使用字母
		在使用变量时,不需要使用$
        例如:((x<=100))


for
	java格式:
		for ((初始化变量;判断条件;控制语句))	
		do
			执行语句
		done	
	python格式:
		for 变量 in 结果集
		do
			执行语句
		done
	结果集:
		{开始..结束}含头含尾,不能引用变量
		`seq 开始 结束`含头含尾
例如:获取1-100的奇数和偶数和
	jsum=0
	osum=0
	for i in {1..100}
	do
	        if ((${i}%2==0))
	        then
	                #osum+=${i} 结果做了拼接 不是算术运算
	                #osum=`expr ${i} + ${osum}`
	                #osum=$[${i}+${osum}]
	                let osum+=i

	        else
	                let jsum+=i
	        fi
	done
	echo 偶数和为:${osum}
	echo 奇数和为:${jsum}
	注意:
		使用let在计算时可以直接使用变量

shell 键盘录入

read:键盘录入
	格式:
		read 变量1 变量2 ...变量n
	注意:
		键盘录入时,允许给多个变量进行赋值,值和值之间以空格切分	

打印三角形
	for i in {1..5}
	do
	        for j in `seq 1 ${i}`
	        do
	                echo -n "* "
	        done
	        echo ""
	done

shell 数组

数组:存储多个元素,数据类型可以不同,元素元素之间以空格切分
	操作
		通过下标获取数据
			格式:
				${数组[下标]}
			注意:
				直接引用数组变量,默认获取下标为0的元素
				下标使用*表示获取所有
		获取长度:
			格式:
				${#数组[*]}

shell 函数

函数
	格式:
	function 方法名(){
		方法体
		return 数字;
	}
	注意:function和return可加可不加
		$0...$n表示接收参数,$0永远是脚本名称(忽略)
		方法的调用直接使用方法名不加()
		return只能返回数字范围在0-255之间
		$?接收返回值只能接收一次

shell 日期

获取当前日期时间
	date +"%Y-%m-%d %H:%M:%S"

格式化日期时间:
	date -d today +"%Y-%m-%d %H:%M:%S"

加减日期时间
	date +%Y%m%d        //显示前天年月日
	date +%Y%m%d --date="+1 day"  //显示前一天的日期
	date +%Y%m%d --date="-1 day"  //显示后一天的日期
	date +%Y%m%d --date="-1 month"  //显示上一月的日期
	date +%Y%m%d --date="+1 month"  //显示下一月的日期
	date +%Y%m%d --date="-1 year"  //显示前一年的日期
	date +%Y%m%d --date="+1 year"  //显示下一年的日期

shell 重定向

重定向:执行命令的结果写写入到文件
command >> file	将输出以追加的方式重定向到 file
command > file	将输出重定向到 file

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
	标准输入文件(stdin):stdin的文件描述符为0,默认从stdin读取数据。
	标准输出文件(stdout):stdout 的文件描述符为1,默认向stdout输出数据。
	标准错误文件(stderr):stderr的文件描述符为2,向stderr流中写入错误信息。

	使用>,>>默认是把正确信息写入文件
	想要把错误信息和正确信息写入文件需要后面追加2>&1(把错误信息当做正确信息去处理)
  
  如果希望屏蔽 stdout 和 stderr,可以这样写:

	$ command > /dev/null 2>&1
  
  /dev/null 文件
  如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

	$ command > /dev/null

shell 定时器

定时器:
	格式:
		*(分钟) *(小时) *(星期) *(几号) *(月份) commend

	通过crontab -e添加定时任务
	查看定时任务是否执行了,看日志tail -f /var/log/cron
	注意:
		定时器或脚本中涉及到路径的全部给绝对路径

	* * * * * 		每分钟
	*/1 * * * * 	每分钟
	0 */1 * * *		每小时

posted @ 2022-01-07 23:11  赤兔胭脂小吕布  阅读(113)  评论(0编辑  收藏  举报