注:shell是操作系统的最外层,shell可以合并编程语言以控制进程和文件,以及启动和控制其他程序。
简单来说:shell就是一个用户跟操作系统之间交互的命令解释器
如图,shell在系统各种的位置
shell独立于内核,它是链接内核和应用程序的桥梁。内核是linux系统的心脏,从开机自检就驻扎在计算机内存中,直到计算机关闭为止。用户的应用程序存储在计算机硬盘上,仅当需要时才被调入内存。shell是一种应用程序,当用户登陆linux系统时,shell就会被调用到内存执行。
查看常见的shell解释器
[root@localhosts ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
注意:/bin/bash是大多数linux中默认的shell解释器。之后的所有脚本的编写都是bash脚本
我们来编写第一个脚本frist.sh
linux不以后缀名区分文件,为了方便记忆这里我就以.sh为结尾
写第一个脚本:
[root@localhosts 桌面]# vim first.sh
#!/bin/bash
#auto my frist scripts
#by authors cd
echo "hello world"
mkdir /root/shell
free -m
注释:
#!/bin/bash 主要是为了声明,我所写的均为bash语言(我是用的是bash解释器)[定义我的脚本是shell脚本].{固定格式}
第二行为注释行,注释信息不生效
#auto echo hello world!
#by authors tree 2016 本脚本是由谁来写的,写这个是为了完成什么目的。
执行过程
[root@localhosts ~]# ll first.sh #查看是否具有执行权限
-rw-r--r-- 1 root root 65 Aug 30 06:50 first.sh
[root@localhosts ~]# chmod o+x first.sh #添加执行权限
[root@localhosts ~]# ll first.sh #查看是否具有执行权限
-rwxr-xr-x 1 root root 65 Aug 30 06:50 first.sh
执行的结果
[root@localhosts ~]# ./first.sh hello world total used free shared buffers cached Mem: 2006 728 1277 0 28 330 -/+ buffers/cache: 370 1636 Swap: 1999 0 1999 或者可以用 /bin/bash/+脚本来执行,这样的就不需要加权限了。
执行脚本的不同方式
第一种使用绝对路径执行
第二种使用相对路径执行,如./的方式
第三种使用 sh命令来执行 格式 sh 脚本名 不需要执行权限
第四种使用 . (空格)脚本名称的方式执行 不需要执行权限 . a.sh
第五种使用 source 脚本名称 不需要执行权限(主要用于生效配置文件)
建议使用后三种,在生产环境中不要轻易的给文件可执行权限;
2、变量
变量用来保存有用信息,比如路径名,文件名,数字等,变量的本质是存储数据的一个或多个计算机内存地址
接下来我们来探讨脚本中作重要的东西---变量,变量的定义是:可以存放一个可变的值的空间
可以通过不同的环境进行改变就是一个可以变的值.
默认情况下: 在Linux中可以将每个shell看成不同的执行环境,所以相同的一个变量名称在不同的变量执行环境中的变量值是不同的.
常见的shell变量分类
自定义变量、环境变量、位置变量、预定义变量
变量的输出
一般使用echo 输出变量 echo $变量名
shell变量总结:
1. 声明变量不用声明类型
2. 可以存储不同类型内容
3. 使用时要明确变量类型
区分大小写。
自定义变量
自定义变量是用户根据自己的环境自己定义的变量,Bash中比较简单的变量;
不用进行提前声明,而是直接指定变量名称并赋给初始值;
定义变量的基本格式为 变量名=变量值
要求:
等号两遍不允许出现空格;
变量名称只能以字母和下划线开头名称中不能包含+、- * 、 / . , 、 ? % * 等一些特殊字符.
举例: var=”hello world”
变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
变量的使用:
格式:$变量名或者${变量名}
echo $var 或者echo ${var}
举例: 来进行定义一个变量名字为Linux值为7.2
[root@localhosts ~]# Linux=7.2 #为变量Linux赋值
[root@localhosts ~]# echo $Linux #输出变量Linux的值
7.2
[ro[root@localhosts ~]# linux=6.5 #为变量linux赋值
[ro[root@localhosts ~]# echo $linux #输出变量linux的值
6.5
可以直接在命令行定义一个变量并赋予值,通过echo进行输出变量 $是引用变量的特殊字符(必须使用$符号)
echo和调用的变量之间必须要有空格
注意大小写的变量的值是不同的
举例2:当需要一起调用两组变量时
[root@localhosts ~]#echo $Linux $linux
7.2 6.5
直接使用echo 后面跟$调用的变量 如果有多个则空格隔开
举例3:当变量名和后面的字符容易混淆的时候应该使用{}将变量名括起来
[root@localhosts ~]#echo system{$Linux}
system{7.2}
取消变量:
语法:unset +变量
[root@localhosts ~]# unset linux
[root@localhosts ~]# echo $linux
其他的特殊操作
双引号( " )
1.当=号右边赋值出现空格的时候,需要使用双引号将其扩起
[root@localhosts ~]# webserver=" nginx 1.11"
[root@localhosts ~]# echo $webserver
nginx 1.11
2、来看下没有引号,有单引号和双引号的区别
# Y=a
# echo $Y
a
# echo '$x'
$x
# echo "$x"
a
read命令
除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)
执行时需要从标准输入设备键盘读取一行,并以空格为分隔符
执行时需要从标准输入设备键盘读取一行,并以空格为分隔符
[root@xuegod63 ~]# read kernel system #同时定义两个变量操作
3.10 7.2 -à手动输入的变量值
由于read命令提供了-p参数,这里可以缩写为:
#!/bin/bash
#by authors tree 20160904
read -p "Enter your name: " name
echo "hello $name,welcome to my class"
exit 0
注意:
由于使用read存在一定的风险,既有可能需要等待用户输入,但用户一直不输入,就没法继续运行。
这时候可以使用read的另外一个参数-t
-t是一个计时器,指定read命令需要等待输入的秒数,当计时满时,直接返回一个非零退出状态。
#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
echo "hello $name ,welcome to my script"
else
echo "sorry,too slow"
fi
exit 0