linux系统:Shell编程基础

一、简单介绍

1.1 什么是Shell

在这里插入图片描述
GUI 提供了一种图形化的用户接口,使用起来非常简便易学;而 Shell 则为用户提供了一种命令行的接口,接收用户的键盘输入,并分析和执行输入字符串中的命令,然后给用户返回执行结果,使用起来可能会复杂一些,但是由于占用的资源少,而且在操作熟练以后可能会提高工作效率,而且具有批处理的功能,因此在某些应用场合还非常流行。
Shell 作为一种用户接口,它实际上是一个能够解释和分析用户键盘输入,执行输入中的命令,然后返回结果的一个解释程序

二、变量运算

2.1 declare命令

2.1.1 声明变量类型

root@tedu:~# declare[+/-][选项]变量名
选项:
	-  : 给变量设定类型属性
	+  : 取消变量的类型属性
	-a : 将变量声明为数组类型
	-i : 将变量声明为整数型(intenger)   # 重点掌握,其他了解
	-x : 将变量声明为环境变量
	-r : 将变量声明为只读变量
	-p : 显示指定变量的被声明的类型

2.1.2 把变量声明为数值型

示例:
root@tedu:~# aa=11
root@tedu:~# bb=22
root@tedu:~# cc=$aa+$bb
root@tedu:~# echo $cc
11+22                 # 默认是字符串型,是字符串的拼接

root@tedu:~# declare -i cc=$aa+$bb  #-i 声明cc是整形
root@tedu:~# echo $cc
33
root@tedu:~# declare -p cc  # 查看变量的被声明的类型
declare -i cc="33"

2.1.3 声明数组变量

  • 定义数组
root@tedu:~# movie[0]=zp
root@tedu:~# movie[1]=tp
root@tedu:~# declare -a movie[2]=live
  • 查看数组
root@tedu:~# echo ${movie}		#zp
root@tedu:~# echo ${movie[2]}	# live
root@tedu:~# echo ${movie[*]}   #zp tp live
# 下标号代表索引 * 代表所有数值

2.1.4 声明环境变量

declare -x test=123
#和export作用相似,但其实是declare命令的作用

root@tedu:~# aa=11
root@tedu:~# bb=22
root@tedu:~# export bb
root@tedu:~# set  aa bb 

2.1.5 声明变量只读属性

root@tedu:~# declare -r test
#给test赋予只读属性,但是请注意只读属性会让变量不能修改不能删除,甚至不能取消只读属性

root@tedu:~# declare -p test    #declare -x test="123"
root@tedu:~# declare -r test
root@tedu:~# declare -p test	#declare -rx test="123"
root@tedu:~# test=456   # -bash: test: readonly variable  只读属性,无法修改
root@tedu:~# unset test	
# -bash: unset: test: cannot unset: readonly varable 变量只读,无法删除	

-r 只要生成,就无法更改,删除,无法还原

2.1.6 查询变量的属性

declare -p
#查询所有变量的属性
declare -p变量名
#查询指定变量的属性

2.2 数值运算的方法

2.2.1 数值运算方法1

root@tedu:~# aa=11
root@tedu:~# bb=22
#给变量aa 和 bb赋值
root@tedu:~# declare -i cc=$aa + $bb

2.2.2 数值运算方法2 expr或let数值运算工具

root@tedu:~# aa=11
root@tedu:~# bb=22
#给变量aa和变量bb赋值

root@tedu:~# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和. 注意 "+"号左右两侧必须有空格

root@tedu:~# echo

2.2.3.“ ( ( 运 算 式 ) ) " 或 " ((运算式))" 或 " (())""[运算式]”

root@tedu:~# aa=11
root@tedu:~# bb=22
root@tedu:~# ff=$(($aa+$bb))
root@tedu:~# gg=$[$aa+$bb]

2.3 运算符的优先级

root@tedu:~# aa=$(((11+3)*3/2))
# 虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级

root@tedu:~# bb=$((14%3))
#14不能被3整除,余数是2

root@tedu:~# cc=$((1&&0))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0

2.4 变量测试(只针对shell语言)

优点: 语法简单,执行效率高
缺点: 逻辑混乱


变量测试在做脚本测试时使用
示例: x=${
    
    y-新值} x=新值 x为空  x=$y


例子1:测试x=${
    
    y-新值}

root@tedu:~# unset y 
#删除变量y
root@tedu:~# x=${y-2}
#进行测试
root@tedu:~# echo $x
2
#因为变量y不存在,所以x=new


例子2:
root@tedu:~# y=""
#给变量y赋值为空
root@tedu:~# x=${y-2}
#进行测试
root@tedu:~# echo $x 
输出为 空

三、正则表达式

3.1 正则表达式

它是用于字符串的模式分割,匹配,查找及替换操作

3.2 正则表达式与通配符

  1. 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式
  2. 通配符用来匹配符合条件的文件名,通配符是完全匹配.ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了.

3.3 基础正则表达式

见附图: 基础正则
在这里插入图片描述

四、流程控制语句

4.1 条件判断式

4.1.1 按照文件类型进行判断

  • 两种判断格式

    • test -e/root/install.log (不常用)

    • [-e/root/install.log] (常用)

示例: 
	[-e /root/install.log]
	echo $?
	
	0(True)
	
	[-d /root] && echo "yes" || echo "no"
	#第一个判断命令如果正确执行,则打印"yes",否则打印"no"
	
	root@tedu:~# 输入:[-e /root/install.log] && ceho yes || echo no
	
	root@tedu:~# 输出: yes

4.1.2 按照文件权限进行判断

[-w student.text]&& echo "yes" || echo "no"
#判断文件是否拥有写权限的
	root@tedu:~# 输入:[-w /root/install.log] && ceho yes || echo no
	root@tedu:~# 输出: yes

4.1.3 两个文件之间进行比较

判断两个文件节点是否一致

4.1.4 两个整数之间比较

# 判断23是否大于等于22,yes
	[23 -ge 22] && echo yes || echo no
	yes
#判断23是否小于等于22,no
	[23 -le 22] && echo yes || echo no
	no

4.1.5 字符串的判断

示例:
name =fengj
#给name变量赋值
[-z $name]&&echo yes || echo no
no
#判断name 变量是否为空,因为不为空,所以返回no


aa = 11
bb = 22
#给变量aa和变量bb赋值
["$aa" == "bb"$echo yes || echo no
no
#判断两个变量的值是否相等,明显不相等,所以返回no
用的是== 判断的是字符串

4.1.6 多重条件判断

aa=11
[-n "$aa" -a "$aa" -gt23] $$echo yes || echo no
no
#判断变量aa 是否有值,同时判断变量aa的值是否大于23
#因为变量aa的值不大于23,所以虽然第一判断值为真,返回的结果也是假

五、if语句

学习小脚本示例的好处

  1. 掌握语法结构
  2. 了解shell的作用

如何 “背” 程序?

  1. 抄写老师的程序并能正确运用
  2. 为程序补全注释
  3. 删掉注释,为代码重新加注释
  4. 看注释写代码
  5. 删除代码和注释,从头开始写

5.1 单分支if条件语句

  • 语法:
	if [条件判断式];then
		程序
	fi
	
	或:
	if [条件判断式]
		then
		程序
	fi
  • 注意事项
    1. if语句使用fi结尾,和一般语言使用大括号结尾不同
    2. [条件判断式]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
    3. then后面跟符合条件之后执行的程序,可以放在[]之后,用";“分割.也可以换行写入,就不需要”;"了
  • 示例:
1.判断登录的用户是否root
	
	test=$(env|grep "USER" | cut-d "=" -f2)
	
	if["$test" == root]
		then
		echo "Current user is root."
	fi
	
	
	实现步骤:
	
	1.在超级用户模式下输入
		#匹配行
		root@tedu:~# env | grep USER=r
		#USER=root
		
		#匹配列
		
		root@tedu:~# env | grep USER=r | cut -d "=" -f 2
		# root
		
		
	2.创建if1.sh文件
		root@tedu:~# vim if1.sh
		#查看穿件的文件
		root@tedu:~# ll
		
		#文件查看需要赋于权限
		root@tedu:~# chmod 755 if1.sh
		
		#运行程序
		test=$(env | grep USER=r | cut -d "=" -f 2)
		echo test
		
		root@tedu:~# ./if1.sh 
		root

	3.进入if1.sh文件
		root@tedu:~# vim if1.sh 
		
		
	4.编写if1文件
		test=$(env | grep USER=r | cut -d "=" -f 2)
		if [ "$test" == "root" ]
			then
                echo "dangqian yonghu shi root"
		fi

	5.执行if1文件
		root@tedu:~# ./if1.sh 
		
	6.执行结果
		dangqian yonghu shi root

5.2 双分支if语句

  • 语法:
if [ 条件表达式 ]
		then 
			条件成立时,执行的程序
		else
			条件不成立时,执行的另一个程序
	fi
  • 示例1:
1.创建if1.sh文件
		root@tedu:~# vim if2.sh
		
	2.进入if1.sh文件
		root@tedu:~# vim if2.sh 
		
	3.编写if2程序
	
		read -t 30 -p "please input a dir:" dir
		
		if [ -d "$dir" ]
				then
						echo "shuru de shi mulu"
				else
						echo "no no no"
		fi
		
	4.退出if2.sh文件
		esc -- :wq
	
	5.执行if2.sh文件
		root@tedu:~# ./if2.sh
		please input a dir:
		
		please input a dir:/root
		shuru de shi mulu
  • 示例2 if3.sh
#判断apache 是否启动
	
	test = $(ps aux | grep | heepd | grep -v grep)
	if [ -n "$test" ]
		then
			echo "httpd is ok"
		else
			echo "httpd is no"
			/etc.rc.d/init/httpd start
	fi

5.3 多分支if语句

  • 语法
if [ 条件表达式1 ]
		then 
			当条件条件判断式1成立时,执行程序1

	elif [ 条件表达式2 ]
		then 
			当条件条件判断式2成立时,执行程序2

	.......
	else
		当所有条件都不成立,最后执行此程序
		
	fi

5.4 case 语句

  • 语法:
case $变量名in
	"值1")
		如果变量的值等于值1,则执行程序1
		;;
	"值2")
		如果变量的值等于值2,则执行程序2
		;;
	...省略其他分支
	
	*)
		如果变量的值都不是以上的值,则执行此程序
        ;;
esac

六、for&while&until语句

6.1 for 循环

  • 语法
for 变量 in 值1 值2 值3...
	
		do
			程序
			
		done
  • 示例:
for i in 1 2 3 4 5
	do 
		echo $i
	done

6.2 while循环和until循环

  • 语法
while [ 条件判断式 ]
		do 
			程序
		done
  • 示例:
#从1加到100
i = 1
s = 0
while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环
	do
		s=$(($s+$i))
		i=$(($i+ 1))
	done
	
echo $s	

6.3 until 循环

和while 循环相反,until循环是只要条件判断不成立则进行循环,并执行循环程序.一旦循环条件成立.则终止循环

i=1
s=0
until [$i -gt 100 ]
	do 
		s=$(( $s+$i))
		i=$(($i+1))
	
	done
	
	echo $s

附图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_52201738/article/details/125365828
今日推荐