shell编程

1、shell是什么

shell是一个特殊的应用程序,为运行其它其它应用程序提供了一个接口。
shell是一个命令解释器。
我们在shell中可以执行单个指令,也可以把要执行的指令,以编程语言的方式组织起来,交给shell去执行
这种组织命令的方式,称为shell脚本。

2、第一个shell脚本

编写:
    用vim编写代码
----------------------------
#!/bin/bash 
echo "hello world"
----------------------------
脚本说明:
    #!用于指定解释当前脚本文件的命令解释器,如果省略,则使用默认shell(ubuntu中默认使用bash)
    echo 类似于printf, 用于输出字符串信息


执行方式1:
    添加可执行权限
    chmod u+x hello.sh 
    再执行即可
    ./hello.sh 

执行方式2:
    source hello.sh 

例如:

openAI 的 GPT 大模型的发展历程。

shell变量

shell中没有类型的概念,所有的变量都是字符串类型,shell变量也不需要定义了,直接赋值就可以使用
一般形式:
变量名=值
注意:
给变量赋值时,等号两边不可以有任何空格
引用变量:
$变量名
${变量名}

自定义变量

如:
filename=“1.c 2.c 3.sh”
filename=ls
echo date
说明:反引号能获取指令的执行结果

特殊的变量

./3.sh a b c
$# 会获取到 3,对应传入脚本的参数个数,统计的参数不包括 $0
$1
命令行第一个参数
$2
命令行第二个参数
$3
命令行第三个参数,$4,$5…依次类推
$*
表示所有的命令行参数
@ 表示所有的命令行参数 " @ 表示所有的命令行参数 " @表示所有的命令行参数"*" 把所有参数合并成一个字符串,而 “$@” 会得到一个字符串参数数组。
$?
表示上一条指令的执行状态,约定,0表示正常,其他值表示出错
$$
表示执行当前脚本的那个shell解释器的PID
说明:
如果用source指令来执行shell脚本,就是用当前shell解释器来执行脚本
如果是用./脚本名 来执行shell脚本,则是启动了一个新的shell解释器来执行脚本,执行完成后,自动关闭解释器

环境变量

在一个脚本文件中定义的普通变量,只能在该脚本中使用
但如果希望普通变量在其他地方也能使用,则需要把该变量设置为环境变量
导出环境变量的方式:
1、定义变量的同时导出为环境变量
export 环境变量名=值
2、先定义变量,在导出为环境变量
变量名=值
export 变量名
系统提供了指令env,可以查看系统上所有的环境变量,如:
HOME
一般称为家目录,即当前用户的用户目录
PATH
指令的查找路径,它的值是用冒号隔开的一组路径名
当执行指令时,从PATH表示的这组路径中进行查找,找到则执行,没找到则报错
用户自己也可以把自己的路径加入到PATH中,方式如下:
export PATH=$PATH:自己的路径
如果希望修改永久生效,则需要把以上对环境变量的修改写入系统的启动脚本:
/etc/profile
然后,保存退出,重启ubuntu。

4、shell脚本语句

说明性语句(注释)
以#号开头的语句都是注释,除了#!/bin/bash
功能性语句
read
从shell终端读取数据,类似于scanf
重定向问题:
输入重定向
一般情况下,输入数据是从键盘输入,但在shell也允许把输入数据的来源重定向到一个文件,这种情况称之为输入重定向
命令 < 文件名
read name < 1.txt
输出重定向
一般情况下,输出数据是把数据输出到终端(屏幕),shell中也允许把数据输出目的 重定向到一个文件
命令 > 文件名 #如果文件不存在,则自动创建,存在则先清空再写入
命令 >> 文件名 #追加写入文件,原有的数据不变
expr
算术运算指令,包括+ - * / %
expr 左操作数 运算符 右操作数
乘法运算符说明(需要转义)
在shell中,默认情况下, *号是一个通配符,用于匹配任意的字符,例如:
ls .c
如果希望
表示乘法,需要把它的特别含义移除,在它前面加一个\即可,例如:
expr 10 * 20
test
test语句可以测试三种对象:字符串、整数、文件
字符串测试
= 测试两个字符串内容是否一样
test 字符串1 = 字符串2
!= 测试两个字符串内容是否不相等
测试结果为ture(0),false(1),使用echo $?来获取test的测试结果
-z 测试字符串是否为空
-n 测试字符串长度是否不为0
整数测试
-eq 测试两个整数是否相等
-ge 测试第一个整数是否大于等于第二个整数
-gt 测试第一个整数是否大于第二个整数
-le 测试第一个整数是否小于等于第二个整数
-lt 测试第一个整数是否小于第二个整数
-ne 测试两个整数是否不相等
文件测试
-d 文件名
测试给定的文件是否为目录
-f 文件名
测试给定的文件是否为一个普通文件
-L 文件名
测试给定的文件是否是软链接文件
-r 文件名
测试给定的文件是否有读权限
-w 文件名
测试文件是否有写权限
-x 文件名
测试文件是否有可执行权限
test还可以简写为[];但是[后面和]前面都必须要有一个空格
例:
test $a -eq $b
可简写为
[ $a -eq $b ]
test的复合表达式
组合了两个或两个以上的表达式,称为复合表达式
在shell中既可以使用test内置的操作符,也可以用条件操作符来创建复合表达式
内置操作符:
-a 表示 and
-o 表示 or
test 表达式1 -a 表达式2 # 两个表达式同时成立,结果才成立
test 表达式1 -o 表达式2 # 任一表达式成员,结果就成立

    条件操作符:
        &&
        ||
        !
        [ 表达式1 && 表达2 ]
        [ 表达式1 || 表达2 ]
        [ ! 表达式1 ]

5、流程控制语句

分支语句
if command; then
语句块
elif command; then
语句块
else
语句块
fi

case 字符串变量 in
模式1)
语句
;;
模式2)
语句
;;
模式3)
语句
;;
esac

for循环
for 循环变量 in 字符串列表
do
循环体
done
说明:
字符串列表是由多个字符串组成且中间用空格隔开的对象
for循环就是用来遍历字符串列表的
for循环还可以写成类C风格的形式
例:
sum=0
for ((i=1;i<=100;i++))
do
sum=expr $sum + $i
done
echo sum=$sum

while循环
    while 表达式
    do 
        循环体
    done 
    
until循环
    until 表达式 
    do 
        循环体
    done
说明: 
    until与while功能类似,但是,until只有当测试的条件为假时,才进行循环,条件成立,则退出循环
    break和continue用法与c相同

6、shell函数

定义函数的一般格式:
函数名()
{
函数体
}
调用方式:
函数名 参数1 参数2 … 参数n
在函数内部
参数1 --> $1
参数2 --> $2
参数3 --> $3
函数返回值获取方式:
1、变量名=函数名 参数列表
该方式其实就是把函数的输出内容保存到指定的变量中
myfunc()
{
sum=expr $1 + $2
echo KaTeX parse error: Expected 'EOF', got '}' at position 6: sum }̲ ret=`myfunc 1…?
可以把函数的调用理解成一条指令的执行,指令可以有退出状态码,使用$?可以获取到
myfunc()
{
sum=expr $1 + $2
return $sum #return返回的整数值的范围是[0,255]
}
myfunc 1 2
echo $? #输出结果为3

7、shell字符串的处理

长度
${#字符串}
s=“hello” # 定义一个字符串变量
echo ${#s} # 计算字符串s的长度

替换
${字符串/原始字符串/新的字符串}
把"字符串"中的第一个"原始字符串"替换成"新的字符串"
例:
echo ${s/he/Ha}
${字符串//原始字符串/新的字符串}
把"字符串"中所有的"原始字符串"替换成"新的字符串"
例:
echo ${s//o/O}

下标截取
${字符串:起始下标:截取长度}
截取从“起始下标”开始的指定长度的字符串,注意:下标从0开始计算
s=“hello”
echo ${s:1:4} # ello
${字符串:起始下标:-截取长度}
表示从又往左截取指定长度的字符串
${字符串;0-起始下标:截取长度}
表示从右往左截取,下标从-1开始计算,截取指定长度的字符串
例:
s=“hello”
echo ${s:0-3} # llo
echo ${s:0-4:2} # el

  #截取
  	${字符串#*模式}
  		从左到右,删除第一个模式及其左边的所有字符
  		例:
  		s="hello"
  		echo ${s#*e} # llo
  		
  	##截取     
  		 ${字符串##*模式}
  		从右到左,删除第一个模式及其左边的所有字符
  		例:
  		s="hello"
  		echo ${s##*l} # o
  		
  	%截取
  	${字符串%模式*}
  		从右到左,删除第一个模式及其右边的所有字符
  		例:
  		s="hello"
  		echo ${s%l*} # hel
  		
  	%%截取
  	${字符串%%模式*}
  		从左到右,删除第一个模式及其右边的所有字符
  		例:
  		s="hello"
  		echo ${s%%l*} # he
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值