一:shell脚本基础
1.shell命令 : 在linux终端能够被解析出来的命令
2.shell脚本 : 多个shell命令的集合, 逻辑判断, 循环, 函数, 变量
二:shell命令被解析的过程:
1.有一个解析命令的进程: bash(linux)/shell(unix)
2.bash解析过程, 监测终端输入, 有回车的时候输入完成, bash检测环境变量PATH (有多个路径), bash从前往后依次遍历每个路径, 检测各个路径中有没有用户输入的命令, 如果找到了, 执行该路径下的命令, 如果没找到找下一个, 最后还是没找到, 提示这个命令无法解析
三:shell脚本的基本格式:
1.命名格式
shell脚本是一个文件, 命令方式: xxx.sh
.sh的后缀不是必须的, 目的是为了方便识别
2.书写格式
(1).第一行是固定的, 指定解析脚本内容使用的命令解析器:#! /bin/bash (指令使用的命令解析器是bash), 这行可以省略
(2).后边就是shell命令, 变量定义, 函数调用, 逻辑判断循环
四:shell脚本的执行
1.文件访问者:
拥有者u——-user
所属组g——-group
其他用户o—–other
2.文件访问权限的种类:
可读(r) 可写(w) 可执行(x)
3.目录初始默认权限为 : 775(八进制), 111 111 101(二进制),-rwxrwxr-x 1 root root
文件初始默认权限为: 644(八进制), 110 110 100(二进制),-rw-rw-r-- 1 root root
脚本文件需要执行权限:
chmod u+x xxx.sh //u:当前文件所有者 + x执行权限
chmod a+x xxx.sh //a:当前文件所有者所有组的人 + x执行权限
chmod 777 xxx.sh
4.脚本文件的执行
./xxx.sh 和执行可执行程序一样,最常用
sh xxx.sh 也可以执行xxx.sh脚本
五:shell脚本中的变量
echo shell命令:表示输出
1.普通变量(本地变量)
//变量名=变量值 (默认字符串类型)
hello=123
//在shell中定义变量的时候, 必须初始化,=前后不能有空格,普通变量名小写
2.环境变量(一般大写)
//export 环境变量名=值 或 set 环境变量名=值
export GOROOT=/usr/local/go
export GOROOT=$HOME/go
//环境变量在全局范围内都可以使用
3.位置变量和特殊变量
在执行脚本文件的时候, 可以进行参数传递, 在脚本内部需要接收这些参数, 这时候需要用到位置变量
$0:脚本的名字
$1:给shell脚本传递的第一个参数,
$2:给shell脚本传递的第二个参数,以此类推
$#: 给shell脚本传递的参数的个数
$@: 给shell脚本传递的所有参数的集合
$$: shell脚本开始执行,产生的进程ID
$?: 进程执行状态(在脚本中没法体现,因为需要进程执行完,才能查看进程执行状态),脚本执行完成后,在命令行中查看
- 0 表示成功
- 非0 表示失败
编写脚本文件:vi position.sh
脚本代码:
#! /bin/bash
ls
echo "脚本的名字 = " $0
echo "第1个参数 = " $1
echo "第2个参数 = " $2
echo "第3个参数 = " $3
echo "第4个参数 = " $4
echo "第5个参数 = " $5
echo "参数的个数: " $#
echo "所有的参数: " $@
echo "脚本执行之后的进程ID: " $$
执行脚本,并传递参数以及执行结果:
image.png
4.取值
(1)取普通变量的值
$变量名
${变量名}
1.JPG
(2)取命令执行之后的结果值
str=$(shell命令)
str=`shell命令`
1.JPG
5.引号的使用
(1)双引号:加双引号和不加是一样的
如果是字符串, 原样输出
如果是待解析的指令, 会将其解析
(2)单引号:
如果是字符串, 原样输出
如果是待解析的指令, 不会解析, 原样输出
6.shell脚本中的if条件判断
注意事项:
if和[]之间有空格
[]和条件判断前后有空格
if [ 条件判断 ];then
处理指令(shell命令)
fi
if [ 条件判断 ]
then
处理指令(shell命令)
fi
if [ 条件判断 ];then
处理指令(shell命令)
elif [ 条件判断 ];then
处理指令(shell命令)
else
处理指令(shell命令)
fi
shell条件测试参考:
1.JPG 2.JPG例:给脚本传参, 文件名, 在脚本中判断这文件名对一个的文件是普通文件还是目录
#! /bin/bash
# 取出文件名
filename=$1
# 判断
if [ -d $filename ];then //当pathname 存在并且是一个目录时返回真
echo "$filename 是一个目录!"
elif [ -s $filename ];then //当filename 存在并且文件大小大于0 时返回真
echo "$filename 存在!!!"
else
echo "$filename 不存在, 或者文件为空"
fi
结果:
1.JPG
7.shell脚本中的for循环
语法: for 变量名 in 列表;do ... done
for num in 123 345 22 33 44 55;do
echo "$num"
done
for dir in $(ls);do
echo "$dir"
done
# 脚本内容
#! /bin/bash
# 遍历当前目录
for dir in `ls`;do
echo $dir
done
# 遍历传递进来的参数
for arg in $@;do
echo $arg
done
结果:
1.JPG
8.shell脚本中的函数
没有函数修饰符, 没参数, 没有返回值
没有参数但是可以传参数, 在函数内部取参数使用的是位置变量
可以得到返回值, 表示的函数的执行状态, 0或非0
0 -> 成功
非0 -> 调用有问题
- 函数定义, 定义完成, 函数体不会执行, 必须被调用
myfunc()
{
函数体
shell指令(for循环, if语句等)
}
2.函数调用
函数名 [参1 参数2 参数3]
myfunc 11 22 33
例子代码:
# 写个函数判断传递进去的文件名是不是目录, 如果存在什么也不干, 不存在, 创建
#! /bin/bash
# 定义函数
myfunc()
{
# 遍历接收到的所有文件名
for name in $@;do
# 文件类型判断
if [ -d $name ];then
echo $name 是一个目录!
else
# 创建目录
mkdir $name
# 判断目录是不是创建成功了
if [ $? -ne 0 ];then
echo "目录创建失败: $name"
else
echo " $name 创建成功..."
fi
fi
done
}
# 函数调用
myfunc a b c d e f g
结果:
1.JPG
网友评论