Shell编程

Shell编程

1. 入门须知
  • 每一个脚本文件里,首行内容一定是:#!bin/bash 表明用哪种shell编译

  • 执行脚本文件时需要有对应的权限 ,可以直接在要执行的文件前加上 sh eg:

    sh ./usr/hello.sh
    
  • echo 相当于写代码用的输出语句 return

  • 变量命名规范

    • 变量名可以由数字,字母,下划线组成,不能以数字开头

    • 编写脚本文件时,给变量名赋值时不要用空格:变量名=变量值

    • 将命令返回值赋给变量:A=$(date)   # 将 date 命令的返回值赋给变量A
      
  • :<<! 
    内容 
    !  		# shell 脚本的多行注释: :<<! 和 ! 都要独占一行
    
2. 变量

linux shell 中变量分为两种:系统变量和用户变量

  • 系统变量类似于windows中的系统变量,一般全为大写字母
  • 用户变量就是在编写一个脚本文件时申明的变量,不可以被全局共享;
基本语法
  • 定义变量: 变量名=变量值
    
  • 撤销变量: unset 变量名		# 释放该变量
    
  • 定义静态变量 readonly 变量名=变量值		# 静态变量不可被 unset
    
3.环境变量
语法
  • export 变量名=变量值		# 将变量名导出为系统变量,相当于windows的系统变量 
    
  • source 配置文件名			 # 将修改后的配置文件刷新,使之立即生效
    
  • echo $变量名			# 查询系统变量名对应的值
    

导出为系统变量后,不同的shell文件都可以访问

4. 位置参数变量
基本语法
  • $n   # 表示接收命令行中的第几个参数,第0个参数是shell文件本身, $1表示接受第1个参数,超过9之后,用 ${10}这样的格式
    
  • $*		# 接受所有的参数,并且把所有参数看成一个整体
    
  • $@		# 接收所有的参数,不过把单独处理每一个参数
    
  • $#		#	表示接收的参数数量
    
举例

脚本内容为:

#!bin/bash

echo "第0个参数是$0, 第一个参数是$1, 第二个参数是$2"
echo "所有参数=$*"
echo "所有参数单独处理为:$@"
echo "参数的总数量为:$#"

输入的命令行为:

sh ./demo.sh 123 45

输出的内容为:

image-20220607212258206
5.预定义变量

就是shell 设计者预先定义好的变量,可以直接在脚本中使用。

基本语法
  • $$		# 返回当前进程的进程号(PID)
    
  • $!		# 返回后台运行的最后一个进程的进程号
    
6.运算符
  • 三种写运算式的方法: $((运算式))   $[运算式]   expr m + n
    
  • 用第三种方式时:运算式之间需要有空格

  • expr 方式中的乘,除,取余:\ * / %

7.流程控制
7.1 基本语法
if [ 条件表达式1 ]     # 条件表达式的前后都必须有一个空格
then
	条件1成立时,需执行的代码块
elif [ 条件表达式2 ]
then
	条件2成立时,需执行的代码块
fi
if [ ]	# 返回false ,即使位空也得留一个空格,不然会有语法错误
7.2 常用判断条件
  • ===== 判断字符串是否相等

  • 两个整数的比较:

    • [ A -lt B ]		# 判断A是否小于B 
      
    • [ A -le B ]		# 判断A是否小于等于B 
      
    • [ A -eq B ]		# 判断A是否等于B 
      
    • [ A -gt B ]		# 判断A是否大于B 
      
    • [ A -ge B ]		# 判断A是否大于等于B 
      
    • [ A -ne B ]		# 判断A是否不等于B 
      
  • 文件权限判断:

    • [ -r ./shcode/aaa.txt ]		# 判断某个文件是否有读的权限
      
    • [ -w ./shcode/aaa.txt ]		# 判断某个文件是否有写的权限
      
    • [ -x ./shcode/aaa.txt ]		# 判断某个文件是否有执行的权限
      
  • 文件类型判断:

    • [ -f ./shcode/aaa.txt ]		# 判断某个文件是否(存在且为常规文件)
      
    • [ -e ./shcode/aaa.txt ]		# 判断某个文件是否存在
      
    • [ -d ./shcode ]		# 判断某个文件是否(存在且为一个目录)
      
7.3 switch-case语句
case $A in 
"值1")						# 若变量A的值等于 值1
代码块1					  # 则执行代码块1,不需要缩进
;;							 # 一个分支的结束符号
"值2")
代码块2
;;
*)							# 剩余其他所有情况
代码块3					 # 如果不满足上面列出的情况 则执行代码块3
;;
esac						# 结束 switch-case 语句
7.4 for循环

for循环有两种表达方式:

  • for i in 值1 值2 值3 值4
    do
    	代码块
    done
    
  • for ((i=1;i<=10;i++))     # 第二种方式类似于高级语言
    do
    	代码块
    done
    
7.5 while循环
while [ 条件表达式 ]		# 关键字while和括号间得有一个空格,条件表达式和前后括号间也必须有一个空格
do
	代码块
done
8. read读取控制台输入
read 选项 参数
  • 选项:
    • -p 表示等待输入值时给的提示
    • -t 表示等待的时间,如果超过时间还没输入 程序就自动往下执行
  • 参数:设置参数名,将输入的参数赋值给参数名
read -t 10 -p "请输入NUM1的值:" NUM1
# 上面这行命令的含义是:等待用户输入一个值,并把它赋值给变量NUM1,而且等待输入的时间不能超过10秒
9. 函数

函数有系统函数和自定义函数,类似于其他语言中的定义。

9.1 系统函数
  • basename 路径 后缀		# 用于查找某个文件名,如果填了后缀参数,则回返回没有后缀的文件名
    
basename /Users/ymy/papers/aaa.sh
image-20220608151531592
basename /Users/ymy/papers/aaa.sh .sh
image-20220608151711354
  • dirname 绝对路径		# 用于返回某个文件的绝对路径,其实和 basename刚好相反
    
dirname /Users/ymy/papers/aaa.sh
image-20220608151949485
9.2 自定义函数
[ function ] 函数名[()]
{
	代码块;
	[return int;]	# 若有返回值则加上这条语句
}

举例:定义一个做加法的函数,从用户输入得到两个加数

#!bin/bash
# 函数定义
function getSum(){
   SUM=$[$n1 + $n2]
   echo "总和为:$SUM"
}
# 读取输入的值
read -p "输入两个加数:" n1 n2
# 函数调用
getSum $n1 $n2 	
image-20220608154032782
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值