1.shell基本介绍
- 什么是shell脚本
shell命令, 在linux终端能够被解析出来的命令
shell脚本 -> 多个shell命令的集合, 逻辑判断, 循环, 函数, 变量
-
shell脚本的基本格式
-
命名格式
shell脚本是一个文件, 命令方式: xxx.sh
.sh的后缀不是必须的, 目的是为了方便识别 -
书写格式
# 第一行是固定的, 指定解析脚本内容使用的命令解析器 #! /bin/bash -> 指令使用的命令解析器是bash, 这行可以省略 #! /bin/sh # 后边就是shell命令, 变量定义, 函数调用, 逻辑判断循环
-
-
shell脚本的执行
# 脚本文件需要执行权限 # 普通目录权限: 775, 普通文件: 664 chmod a+x xxx.sh chmod 777 xxx.sh # 脚本文件的执行 ./xxx.sh #最常用 sh xxx.sh
2.shell脚本中的变量
-
变量的定义
-
普通变量(本地变量)
变量名=变量值 -> 默认变量是字符串类型 # 在shell中定义变量的时候, 必须初始化 # =前后不能有空格 # 普通变量名小写 # 两种取值方式 str=$(shell命令) str=`shell命令` #单引号和双引号的区别: 如果是字符串,原样输出; 如果是带解析的指令,单引号原样输出,双引号会将其解析。
-
环境变量 - 一般大写
# 环境变量在全局范围内都可以使用 # 环境变量名一般大写 # 创建: 环境变量名=值 # 将普通变量提升为环境变量 export 环境变量名=值 set 环境变量名=值
-
-
位置变量
在执行脚本文件的时候, 可以进行参数传递, 在脚本内部需要接收这些参数, 这时候需要用到位置变量
# 脚本传参, test.sh
./test.sh 12 23 34 56 67
# 位置变量
$0: ./test.sh, 执行的脚本文件的名字
$1: 给脚本传递的第一参数, 12
$2: 给脚本传递的第2参数, 23
$3: 给脚本传递的第一参数, 34
demo:
#! /bin/bash
ls
echo "脚本的名字 = " $0
echo "第2个数值 = " $1
echo "第3个数值 = " $2
echo "第4个数值 = " $3
echo "第5个数值 = " $4
echo "第6个数值 = " $5
echo "参数的个数: " $#
echo "所有的参数: " $@
echo "脚本执行之后的进程ID: " $$
Output:
./test.sh 1 aa bb cc dd ee ff gg hh
poistion.sh
脚本的名字 = ./test.sh
第2个数值 = 1
第3个数值 = aa
第4个数值 = bb
第5个数值 = cc
第6个数值 = dd
参数的个数: 8
所有的参数: aa bb cc dd ee ff gg hh
脚本执行之后的进程ID: 12901
-
特殊变量
$#
: 给shell脚本传递的参数的个数$@
: 所有参数的集合$?
: 进程执行完成之后的状态- 0 -> 成功
- 非0 -> 失败
$$
: 进程的进程ID
3.shell条件判断和循环
-
shell脚本中的if条件判断
# 注意事项: # if和[]之间有空格 # []和条件判断前后有空格 if [ 条件判断 ];then 处理指令(shell命令) fi # 或者 ================== if [ 条件判断 ] then 处理指令(shell命令) fi # 或者 ============== if [ 条件判断 ];then 处理指令(shell命令) elif [ 条件判断 ];then 处理指令(shell命令) else 处理指令(shell命令) fi
在脚本中判断这文件名对一个的文件是普通文件还是目录
#! /bin/bash
# 取出文件名
filename=$1
# 判断
if [ -d $filename ];then
echo "$filename 是一个目录!"
elif [ -s $filename ];then
echo "$filename 存在!!!"
else
echo "$filename 不存在, 或者文件为空"
fi
-
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 # 测试 ~/shell$ chmod a+x for.sh ~/shell$ ./for.sh aa bb cc dd 123 456 789 a for.sh if.sh aa bb cc dd 123 456 789
4.shell脚本中的函数
# 没有函数修饰符, 没参数, 没有返回值
# 没有参数但是可以传参数, 在函数内部取参数使用的是位置变量
# 可以得到返回值, 表示的函数的执行状态, 0或非0
0 -> 成功
非0 -> 调用有问题
# 函数定义, 定义完成, 函数体不会执行, 必须被调用
myfunc()
{
函数体
shell指令(for, if)
}
# 函数调用
函数名 [参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 $@
# 测试
~/shell$ ls
a for.sh function.sh if.sh poistion.sh
~/shell$ chmod u+x function.sh
~/shell$ ls
a for.sh function.sh if.sh poistion.sh
~/shell$ ./function.sh a b c
a 是一个目录!
b 创建成功...
c 创建成功...