以下知识来自尚硅谷。
一、概述
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
二、脚本入门
1、脚本格式
脚本以#!/bin/bash开头(指定解析器)
2、第一个Shell脚本:
需求:创建一个Shell脚本helloworld.sh,输出helloworld
编辑helloworld.sh脚本:
#!/bin/bash echo "helloworld"
执行helloworld.sh脚本:sh helloworld.sh 或者 bash helloworld.sh
如果直接 ./helloworld.sh来执行,若需要执行权限,则可先chmod 777 helloworld.sh,再执行。
三、变量
(1)系统变量
1、常用系统变量:
- $HOME:家目录
- $PWD:当前所在目录
- $SHELL:当前所用的shell编译器
- $USER:当前的用户
(2)自定义变量
1.基本语法
(1)定义变量:变量=值(等号两边不能有空格)
(2)撤销变量:unset 变量
(3)声明静态变量:readonly变量,注意:不能unset
2、定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。如 D="banzhang love mm"
(5)可把变量提升成全局环境变量,可供其他shell程序使用。export 变量名
(3)特色变量:$n
1、$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
(4)特色变量:$#
1、$# (功能描述:获取所有输入参数个数,常用于循环)。
(5)特色变量:$*、$@
- $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
- $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
- 比较$*和$@区别
(a)$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
(6)特色变量:$?
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
(7)字符串前加x
linux 中 if [ "x${var}" = "x" ] 什么意思
if [[ x"${aa}" == x"b" ]]
then
A=$aa
else
B=$aa
fi
其中的if 第一行是什么意思
四、运算符
(1)“$((运算式))”或“$[运算式]”
(2)expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
实操:
五、条件判断
1.基本语法
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
2、常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
六、流程控制
1、if判断
if [ 条件判断 ];then
******
elif [ 条件判断 ];then
******
fi
2、case语句
注意事项:
1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2) 双分号“;;”表示命令序列结束,相当于java中的break。
3) 最后的“*)”表示默认模式,相当于java中的default。
上面的例子,如果输入变量为4,结果仍打印renyao。
3、for循环
4、while循环
七、 read读取控制台输入
八、函数
1、系统函数
- basename:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
- dirname:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
2、自定义函数
1.基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
funname
2.经验技巧
(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)