一、Shell脚本简单的介绍(Shell脚本有多个类,默认的是bash,因为它免费,开源)
- 1.1、建立脚本 hello.sh
touch hello.sh 定义文件声明 #!/bin/bash echo "Hello world!"
- 1.2、查看脚本权限
ls -l hello.sh
- 查看的结果如下
提示:d
:代表的是文件夹 -
:代表的是文件
- 1.3、修改文件的权限(
.
:任何用户都有执行的权限)
chmod +x ./hello.sh
- 1.4、执行脚本语言(cd进入文件的所在目录,再 ./脚本文件)
./hello.sh
二、Shell脚本语法
- 2.1、注释(
#
表示注释),如下代码
#!/bin/bash #1、第一个Shell程序? #第一个Hello程序 echo "Hello world!"
提示:Shell脚本没有多行注释,只有单行注释
- 2.2、Shell脚本语言变量
- <1>、变量的定义注意事项
注意一:定义变量的时候,变量名不需要加"$"符号,如下:
$name="王聪" ❎
- 注意二:变量名和等号之间不能有空格(这个大家可以知道和我们平时的语言不一样),如下:
name ="IronMan" ❎
- 注意三:变量名首字母必须是:字母(a-z,A-Z)、下划线也可以、双下划线也可以,如下:
name1="王聪" ✅ _name2="王聪" ✅ __name3="王聪" ✅
- 注意四:变量名之间可以有下划线,但是不能有空格,如下:
na me4="王聪" ❎
- 注意五:变量里面不允许使用标点符号,如下:
na,me5="王聪" ❎
- <2>、只读变量,关键字:readonly,如下例子
name="王三" readonly name name="李四"
执行脚本报错:
./hello.sh: line 12: name: readonly variable
- <3>、删除变量,如下
name="小王" # 打印变量 echo $name # 删除变量 unset name # 再次打印变量 echo $name echo "打印了"
提示:
unset name
删除变量name
- <4>、变量的类型
- 类型一:本地变量,作用域:整个bash进程可以用,语法:
name="Dream"
- 类型二:局部变量,作用域:当前代码段(修饰符:local),语法:
local name="小王"
- 类型三:环境变量,作用域:当前shell进程以及子进程,语法:
export name="小梨"
- 类型四:位置变量
#!/bin/bash #给我们的脚本文件传递参数 #文件名称 fileName=${0} #参数一 name=${1} #参数二 height=${2} #参数三 age=${3} echo "姓名:${name} 身高:${height} 年龄:${age}"
- 类型五:特殊变量
${0}
:特殊变量:脚本的文件名${?}
:表示返回上一个命令执行状态返回值
- 0:表示执行成功
- 1:程序执行结果
- 2:表示程序状态返回码(0-255)
$#
:表示参数的个数$*
:表示参数的列表$@
:也表示参数的列表$$
:表示当前 shell 的进程 ID$!
:表示执行上一个命令的 PID
$*
与$@
的区别
$*
: 参数列表:将所有的参数列表组成一个字符串
$@
:参数列表:将所有的参数列表分开展示出来
- 2.3、Shell脚本语言:字符串
- <1>、单引号:打印结果 baby1
#!/bin/bash name1='baby1' echo ${name1}
- <2>、双引号:打印结果 baby2
#!/bin/bash name2='baby2' echo ${name2}
- <3>、字符串拼接
- 拼接方式一:
#!/bin/bash name='baby' age=100 sex="男" info="${name}${age}${sex}" echo ${info}
- 拼接方式二:
#!/bin/bash name='baby' age=100 sex="男" info="姓名:"${name}"年龄="${age}"性别="${sex}"" echo ${info}
- <4>、获取字符串的长度:下面脚本的执行结果:4
#!/bin/bash name='baby' echo ${#name}
- <5>、字符串的截取:语法: ${变量名:开始位置:截取长度}
- 案例一:结果是:have
#!/bin/bash name='I have a dream' echo ${name:2:4}
- 案例二:从第3个位置截取到最后,结果是:
have a dream
方式一:
#!/bin/bash name='I have a dream' length="${#name}" echo ${name:2:length-1}
- 方式二:
#!/bin/bash name='I have a dream' echo ${name:2}
- 案例三:0-6的截取,结果是:
I have
#!/bin/bash name='I have a dream' echo ${name:0:6}
- <6>、字符串的删除
- 语法一:$(变量名#删除字符串 正则表达式)作用:从字符串开头(左边)开始匹配要删除字符串
- 案例一:结果是:I have a dream,原因匹配不上,从左到右匹配的
#!/bin/bash name="I have a dream" result=${name#dream} echo ${result}
- 案例二:结果是: have a dream
#!/bin/bash name="I have a dream" result=${name#I} echo ${result}
- 案例三:查找指定字符第一个,并且删除前面所有的字符(包含自己)
#!/bin/bash name="I have a dream" result=${name#*d} echo ${result}
- 案例四:删除指定范围(闭区间,包含首尾),结果是:ream
#!/bin/bash name="I have a dream" result=${name#I*d} echo ${result}
- 语法二:$(变量名##删除字符串 正则表达式)作用:从字符串结尾(右边)开始匹配要删除字符串
- 案例一:结果是:
m
#!/bin/bash name="I have a dream" result=${name##*a} echo ${result}
总结:
语法一
与语法二
都是从左边往右边
删除的,仅仅是查找的方向不一样而已
- 语法三:$(变量名%删除字符串 正则表达式),从字符串结尾开始匹配,删除匹配的字符串
- 案例一:查找第一个字符,结果查找不到,因为是从右往左开始查找的
#!/bin/bash name="I have a dream" result=${name%a} echo ${result}
- 案例二:查找第一个字符,结果查找到,因为是从右往左开始查找的
#!/bin/bash name="I have a dream" result=${name%m} echo ${result}
- 案例三:查找指定字符第一个,并且删除所有字符,打印结果是:
I
#!/bin/bash name="I have a dream" result=${name%h*} echo ${result}
- 案例四:指定删除范围,打印结果是:
I have a dre
#!/bin/bash name="I have a dream" result=${name%a*m} echo ${result}
- 语法四:${变量名%%删除字符串 正则表达式}
- 案例一:查找指定字符串最后一个,并且删除前面所有的字符串(包含自己)
#!/bin/bash name="I have a dream" result=${name%a*} echo ${result}
提示:% 决定方向的问题
1个 %:查询方向从右到左 结果是:I have a dre
2个 %:查询方向从左到右 结果是:I h