通俗来讲shell脚本就是把shell命令放在一个“脚本”中,脚本的第一行#!/bin/bash
意思为这个脚本指定一款在/bin/下名叫bash的shell解释器,来解释接下来的任何命令,如果我们的系统用的是其他解释器就要将/bin/bash改为其他名字。
一:变量
shell脚本是一种弱类型语言,在脚本中使用变量不需要也无法指定变量的“类型‘。默认情况下shell脚本的变量都是字符串。
(1)变量的定义和赋值
变量名=”字符串“
要注意的是赋值号的两边没有空格!在shell脚本中,任何时候要给变量赋值,赋值号两边都一定不能有空格。
变量名只能包含英文字母和数字,且不能以数字开头
(2)变量的引用
$变量名
在引用变量获取里面的值时在变量前加美元符号即可
(3)变量的种类
shell脚本中变量分为三类:普通用户自定义的变量、系统预定义的环境变量、命令行变量
系统预定义的环境变量:可以使用env命令来查看
命令行变量:指的是在脚本内部使用用户从命令行传递进来的参数
$#:代表命令行参数的个数
$*:代表所有参数
$@:同上
$n:第n个参数
$?:最后一个命令执行之后的返回值,常用来判断命令是否执行成功
$$:代表当前进程号的PID
但是事实上变量前的$符号只是对变量的引用,真正的主体是$后面紧跟着的#、*、@、n、?、$
二:特殊符号
shell脚本中有几种特殊符号分别是引号,竖杠(管道),大于号小于号(重定向)
(1)引号
引号有三种,他们是双引号、单引号、反引号
双引号是将一些单词括起来形成一个值,在双引号中也可以用变量的引用
单引号是其内部的所有成分都视为普通的字符
反引号的作用就是在双引号中标识出shell命令
(2)管道
简单的举个例子
find 查找路径 -name 文件名 -not -path "排除的路径" -type f | xargs grep "要查找的字符串" -rn
以上命令解释为:在排除路径外的查找路径中寻找所有匹配文件名的文件其类型为普通文件将其结果通过管道排列成一行作为grep命令查找的文件输入,结果加行号打印
(3)大于号>和小于号< 重定向
例子
echo "hello world" >1.log
该命令会将hello world输出到1.log文件中
三:测试语句
test命令专门用来实现所谓的测试语句
语句 含义 说明
test -e file 判断文件file是否存在 成立返回0,否则返回1(下同)
test -r file 判断文件是否可读
test -w file 判断文件是否可写
test -x file 判断文件是否可执行
test -d file 判断文件是否是目录
test -f file 判断文件是否是普通文件
test -s file 判断文件是否非空
test s1 = s2 判断字符串s1和s2是否相等
test s1 != s2 判断字符串s1和s2是否不同
test s1 < s2 判断字符串s1是否小于s2
test s1 > s2 判断字符串s1是否大于s2
test -n s 判断字符串s长度是否非0
test -z s 判断字符串s长度是否为0
test n1 -eq n2 判断数值n1是否等于n2
test n1 -ne n2 判断数值n1是否不等于n2
test n1 -gt n2 判断数值n1是否大于n2
test n1 -ge n2 判断数值n1是否大于或等于n2
test n1 -lt n2 判断数值n1是否小于n2
test n1 -le n2 判断数值n1是否小于或等于n2
test常用中括号[]代替,但要求[]两边必须有空格
四:脚本语法单元
(1)分支控制
if 条件
then
执行语句
elif 条件
then
执行语句
else
执行语句
fi
会C语言的自行理解,不会接放弃吧
分支语句的语法要点有三处
1:每个if语句都有一个fi作为结束标记
2:分支语句中使用then作为起始语句
3:有且仅当if后面的结果为真(0)时,then语句才会被执行
case $1 in
1) echo 1
;;
2)echo 2
;;
esac
case自行理解
(二)循环控制
shell脚本有三种可用的循环结构,他们分别是while循环,until循环,和for循环
while 条件
do
语句
done
满足条件即循环执行do下的语句,done结束
until 条件
do
语句
done
满足条件则退出,否则执行do下的语句
for 变量 in 字符串
do
语句
done
字符串有几个单词就循环几次,变量的值每次循环都是字符串中的不同单词依次取值。
五:函数
函数名 ()
{
执行语句
return 0
}
函数名定义遵循c规则,括号中不能用参数,调用时$n来表示第n个参数,$?代表函数调用的返回值
命令杂记:
local:定义函数的局部变量
unset:删除已定义的
read:接受标准输入