一、shell简介
1、shell是什么
shell是命令解释器(command interpreter),是linux操作系统的用户接口
程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)
能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户.
计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式
转换为计算机能够直接执行的。
这种将高级编程硬件程序设计语言编写的源程序转换
到机器目标程序的方式有两种:解释方式和编译方式。
常见的编程语言分为两类:一个是编译型语言,如:c/c++/等,
它们远行前全部一起要经过编译器的编译。另一个解释型语言,执行时,
需要使用解释器一行一行地转换为代码,如:awk, perl,java, python与shell等。
Shell也是一门编程语言,即shell脚本,shell是解释执行的脚本语言,
可直接调用linux命令。
shell编程就是对一堆Linux命令的逻辑化处理。
虽然没Shell有 C/C++、Python、Java、C# 等编程语言强大,
但也支持了基本的编程元素,
例如: 变量、数组、字符串、注释、加减乘除等概念。if…else 选择结构,for、while、
until 循环等流程控制语句。为了方便模块化开发,Shell 也支持自定义函数。
除了 Shell,能够用于 Linux 运维的脚本语言还有 Python 和 perl
二、shell 能干什么
1、实现自动化系统批量的初始化工作(时间设置,update,安全策略设置)
2、自动化批量的软件部署(LAMP/lvs/tomcat/nginx)
3、日志的分析处理程序(比如多少返回200的码)
4、管理应用程序
5、自动化的备份回复程序(比如mysql的备份与回复+计划任务去备份)
6、自动化的管理程序(批量远程修改改密码程序)
7、自动化采集及监控程序(收集应用的状态信息比如cpu的使用,内存的使用,
磁盘的使用和网络的使用等)等待
三、查看当前使用的shell
一个系统可以存在多个shell,可以通过cat /etc/shells命令查看
系统中安装有那些shell,
不同的shell可能支持的命令语法是不相同的。
常用的shell主要有:sh (bash) 和csh(C shell(csh和tc shell(tcsh))
csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,
共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,
也就是说,csh其实就是tcsh。
查看当前使用的shell: echo $SHELL
四、shell程序执行过程及编写说明
1、程序执行及说明
1-1指令的执行是从上而下、从左往右的分析执行
1-2 指令执行时 指令、选项和参数间的多个空白都会被忽略掉
1-3 #单号注释也会被忽略掉
1-4 如果一行的内容太多,则可以使用『 \[Enter] 』来延伸至下一行 \
1-5 shell程序脚本编写文件头注释建议:
1. 内容功能;
2. 版本信息;
3、修改日期;
4.作者名称。
2、Shell 的编写流程:
1. 编写 Shell 脚本
2. 赋予可执行权限
3. 执行,调试
3、代码注释
多行注释
多行注释还可以使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF (小写也可以)
执行()和{}
()和{}都是对一串的命令进行执行,但有所区别:
相同点:
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
if (( a > b )) && (( a < c )) 或者if [[ $a > $b ]] && [[ $a < $c ]] 或者if [ $a -gt $b -a $a -lt $c ]
五、shell脚本的执行
**1、Shell有两种执行命令的方式:**
交互式(Interactive):解释执行用户的命令,用户输入一条命令,
Shell就解释执行一条。
批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,
让Shell一次把这些命令执行完,而不必一条一条地敲命令。
对于批处理方式可以这样执行程序:bash 脚本名称 或 ./脚本名称
两种执行shell的区别
2、sh和bash命令用法:
sh FileName
bash FileName
作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"
注:两者在执行文件时的不同,是分别用自己的shell来跑文件。
sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,
可以巧妙地利用shell的内置变量增强“-x”选项的输出信息等。
3、./的命令用法:
./FileName
作用:打开一个子shell来读取并执行FileName中命令。
注:运行一个shell脚本时会启动另一个命令解释器.
每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
shell脚本也可以启动他自已的子进程.
这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.
六、输入与输出命令
1、echo 选项 内容 (相当于python中的print)相当于C语言中printf
-n 不换行
-e 支持转义字符
注意echo支持转义为:\ ,\n,\t
printf "%.2f--%d" 12.3 5.0
2、read 选项 [变量名称] (相当于python中的input) 相当于 C语言中scanf
-p 可以加输入提示
注意:在read命令行中也可以不指定变量.如果不指定变量,
那么read命令会将接收到的数据放置在环境变量REPLY中。
在上面read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,
则第一个数据给第一个变量,第二个数据给第二个变量,
#例子1:
#!/bin/bash
read -p "Enter your name:" name
echo "hello $name, welcome to my program"
exit 0
#例子2:
#!/bin/bash #声明用那个解释器来解释执行下边的程序
echo "请输入第一个数"
read num1 #read命令加 -p选项可以加输入提示
echo "请输入第二个数"
read num2
echo "显示结果为:num1=$num1 num2=$num2"
echo $(($num1+$num2))
echo "读入测试"
read
echo $REPLY #read不指定变量讲赋值给内置变量REPLY
3、alias 用来给命令创建一个别名。若直接输入该命令且不带任
何参数,
则列出当前 Shell 环境中使用了哪些别名。现在你应该能
理解类似ll这样的命令
为什么与ls -l的效果是一样的。
看一下有哪些命令被默认创建了别名:
alias
alias myShutdown=‘shutdown -h now’
注意:这样定义别名只能在当前 Shell 环境中有效,换句话说,重新登录后这个别名
就消失了。为了确保永远生效,可以将该别名手动写入到用户主目录中的.bashrc文件。
.bashrc其实也是一个 Shell 脚本文件,该文件专门用来存
放用户自定义的别名和函数。
在.bashrc中增加别名变量后,不会立即有效 重启终端就可以使用
使用 unalias 内建命令可以删除当前 Shell 环境中的别名
七、我的第一个shell脚本
#!/bin/bash #声明用那个解释器来解释执行下边的程序
#我的第一个shell程序---这个是单行注释
name="axl" #定义变量
echo $name #打印变量的值 ${name} 此大括号可以省略,在不引起歧义的情况下
echo $* #代表所有的参数
echo "参数个数为$#" #$1”
特殊变量说明
$* 代表所有的参数(我们在shell命令后面加了hello 和world两个参数)。
$# 代表参数的个数
$n 这里的n为数字代表第几个参数