一、概述:
操作系统中基础的是硬件(cpu,内存),外面一层是Linux的内核,在外面一层是应用程序,那么shell在中间扮演的角色就是关联内核和应用程序
shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。
二、Shell解释器
1、Linux提供的解释器
[root@localhost ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin
有6个常用的一般是前面两个,Shell脚本的特点一般都是已.sh结尾的
2、bash和sh的关系
[root@localhost bin]# ll |grep bash -rwxr-xr-x. 1 root root 960472 8月 3 2017 bash lrwxrwxrwx. 1 root root 4 1月 25 13:50 sh -> bash
从sh -> bash可以看出来,两者是软连接,sh最终调用的其实也是bash
3、centos默认的解释器是bash
[root@localhost bin]# echo $SHELL
/bin/bash
三、shell脚本的格式
1、具体格式:
脚本以#!/bin/bash开头(指定解析器:bash,当然也可以指定sh #!/bin/sh )
实例1:输出hellword
1)一般情况下我们可以在终端输入:echo hellword -->执行结果:helloword
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出
2)用shell的sh、bash或者./执行
[root@localhost data]# touch helloword.sh [root@localhost data]# vi helloword.sh 文件内容: #!/bin/bash echo "hello girl" #第一种相对路径下用sh 、bash执行 [root@localhost data]# sh helloword.sh hello girl [root@localhost data]# bash helloword.sh hello girl #绝对路径下用sh 、bash执行 [root@localhost data]# bash /opt/data/helloword.sh hello girl [root@localhost data]# sh /opt/data/helloword.sh hello girl #第二种采用输入脚本的相对路径/绝对路径执行 -->结果权限不够 [root@localhost data]# ./helloword.sh -bash: ./helloword.sh: 权限不够 [root@localhost data]# /opt/data/helloword.sh -bash: /opt/data/helloword.sh: 权限不够 #赋予执行权限 [root@localhost data]# chmod +x helloword.sh [root@localhost data]# ./helloword.sh hello girl [root@localhost data]# /opt/data/helloword.sh hello girl
第一种和第二种的区别在于:第一种的本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;第二种本质是脚本需要自己执行,需要执行权限
实例2:多命令行处理
需求:通过shell脚本实现:在/opt/data目录下创建一个test.txt文件,并在文件中写入I love zly
1)实际操作
创建一个batch.sh文件并写入shell脚本 [root@localhost data]# touch batch.sh [root@localhost data]# vi batch.sh #!/bin/bash cd /opt/data touch test.txt echo "I love zly" >> test.txt #执行batch.sh文件并查看是否生成test.txt并且文本内容是否是“I love zly” [root@localhost data]# bash batch.sh [root@localhost data]# ll 总用量 12 -rw-r--r--. 1 root root 71 1月 28 16:26 batch.sh -rwxr-xr-x. 1 root root 31 1月 28 16:04 helloword.sh -rw-r--r--. 1 root root 11 1月 28 16:26 test.txt [root@localhost data]# cat test.txt I love zly
注意:echo "I love zly" >> test.txt 中的>>是重定向的意思,实际的作用是把“I love zly”添加到test.txt文件中
实例2:加入到环境变量后执行
以wufq用户为例,比如执行/home/wufq/data下的所有.sh文件
1、先查看wufq用户的HOME路径
2、修改当前用户的环境变量
在当前用户的根目录下,执行
vi .bash_profile
把data路径添加到path内
3、保存后,source .bash_profile
4、增加data目录下所有.sh文件可执行的权限,然后就可以直接用文件名执行了
三、shell中的变量
1、常用的系统变量
$HOME、$PWD、$SHELL、$USER等
显示当前Shell中所有变量:set
[root@localhost data]# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=()
2、自定义变量
1)基本语法:
---> 定义变量:变量=值 (规范:变量和值之间不能有空格)
[root@localhost data]# A =1 -bash: A: 未找到命令 [root@localhost data]# A = 1 -bash: A: 未找到命令 [root@localhost data]# A=1 [root@localhost data]# echo $A 1
---> 撤销变量:unset 变量
[root@localhost data]# unset A
[root@localhost data]# echo $A
[root@localhost data]#
---> 声明静态变量:readonly变量,注意:不能unset
[root@localhost data]# readonly C=5 [root@localhost data]# echo $C 5 [root@localhost data]# unset [root@localhost data]# echo $C 5 [root@localhost data]#
执行unset无效
2)变量定义规则
--> 变量名可以由字母,数字和下划线组成,但是数字不能开头,环境变量名建议大写
--> 等号两侧不能为空格
--> 在bash中,变量的默认类型都是字符串类型,不能进行数值的运算
--> 变量的值如果有空格,需要用双引号或单引号引起来
[root@localhost data]# TEST_1="test ing"+1
[root@localhost data]# echo $TEST_1
test ing+1
--> 可把变量设置成全局变量,其他的Shell程序可以使用 ==>通过export 变量名来设置
[root@localhost data]# vi helloword.sh #!/bin/bash echo "hello girl" echo $TEST_1 --->增加这行内容 [root@localhost data]# export TEST_1 -->把TEST_1变量设置成全局变量 [root@localhost data]# sh helloword.sh hello girl test ing+1 -->显示出来了说明:全局变量已经设置成功
3、特殊变量:
1)$n:n为数字,$0代表脚本名称,$1~$9代表的第一到第九个参数,十以上的参数需要用大括号包含:如:${10}
举例:
2)$#:获取所有输入参数个数,常用于循环
3)$*:代表命令行中所有的参数,把所有的参数看做一个整体
$@:也是代表命令行中所有的参数,不过$@是把每个参数区别对待
4)$?:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令的正常执行,如果这个变量的值为非0(具体是哪一个值,由命令本身确定),则证明上一个命令没有正常执行
四、运算符
1、基本语法:$((运算式)) 或 $[运算式]
2、expr + - * / % ==> 加 减 乘 除 取余 注意:expr 运算符间要有空格
举例1:
举例2:
expr一步完成运算方式
采用$[运算符的方式] 计算
[root@localhost data]# Y=$[ (2+3) *4]
[root@localhost data]# echo $Y
20
五、条件判断
1.基本语法
[ condition ](注意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)