shell基础知识

一.基本概念

1、什么是shell?
        shell是linux的一外壳,它包含在linux内核的外面,为用户和内核之间的交互提供了一个接口。当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理后让内核做出相应的动作.系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上。
2、shell脚本:
        shell脚本是一种解释型语言,当命令或者程序不在命令行执行,而是通过一个程序文件来执行,这个程序就被称为shell脚本,也就是在shell脚本里内置了多条命令,语句,循环控制,然后将这些命令一次性执行完毕,这种通过文件执行命令的方式称为非交互式。
3、shell语言与其他语言的区别
(1)shell是解释性语言,需要指定解释器,用bash翻译,比较慢。
(2)C语言是编译性语言,比较快。

4、为什么使用shell脚本?

  1. 适合处理操作系统底层的业务,有众多系统命令为其做支撑(还有文本处理三兄弟grep,sed,awk)
  2. 适合处理纯文本文件,linux中许多服务配置文件,启动脚本,都是纯文本(httpd,nfs,mysql,nginx,lvs)
  3. linux系统脚本用shell开发更简单

二.shell脚本的具体使用

1、查看系统通中的默认shell

三种方式:
[root@server Desktop]# echo $SHELL     # 第一种方法
/bin/bash
[root@server ~]# cat /etc/passwd | head -1   # 第二种方法
root:x:0:0:root:/root:/bin/bash
[root@server ~]# grep root /etc/passwd      # 第三种方法
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2、脚本的执行过程
(1) 先加载系统环境变量(env可以查看环境变量)
(2)一条一条执行,遇到子脚本,先执行子脚本,然后返回父脚本继续执行

3、脚本执行方法
(1)sh script.sh | bash script.sh    
没有执行权限时

[root@localhost ~]# sh log.sh 
Logs cleaned up...

(2)path/script.sh | ./script(要在脚本的当前目录下)
绝对路径,需要给脚本添加执行权限

[root@server ~]# /root/log.sh 
-bash: /root/log.sh: Permission denied   ##没有执行权限时,不可执行
[root@server ~]# chmod +x log.sh 
[root@server ~]# /root/log.sh            ##添加权限后正常执行
Logs cleaned up...

(3)source script.sh | . script.sh

a、这种方式会使用source或.号来读如入指定shell文件,并会把其他shell中的变量值或函数返回给父shell继续使用。
b、前两种方式,在执行脚本的时候,会默认打开一个新的shell,而新shell的变量值和函数不会返回给父shell。

[root@server mnt]# vim test.sh
#!/bin/bash
username=`whoami`
[root@server mnt]# sh test.sh 
[root@server mnt]# echo $username        ##无返回值

[root@server mnt]# source test.sh 
[root@server mnt]# echo $username        ##有返回值
root

面试题:

[root@server mnt]# vim test.sh
  1 #!/bin/bash
  2 username=`whoami`
[root@server mnt]# sh test.sh 
[root@server mnt]# echo $username     # 查看不到

[root@server mnt]# chmod +x  test.sh
[root@server mnt]# ./test.sh 
[root@server mnt]# echo $username    # 也查看不到

[root@server mnt]# source test.sh 
[root@server mnt]# echo $username
root

4.shell脚本的建立

(1)简单的脚本文件
[root@server ~]# cd /mnt
[root@server mnt]# vim test.sh
  1 #!/bin/bash
  2 echo "hello world"
[root@server mnt]# sh test.sh 
hello world

练习:写一个下载apache的安装脚本,并开机自启动

[root@server mnt]# vim httpd_install.sh  
  1 #!/bin/bash    # 指定解释器,指定由哪个程序来执行脚本
  2 yum install -y httpd   >>  /dev/null
  3 systemctl start httpd
  4 systemctl enable httpd
  5 echo "httpd is installed..."
上面的脚本有非常大的缺陷:
  • 没有用户判断,任何用户都可以执行这个脚本
  • 没有流程控制,只是把简单的命令进行顺序操作,没有成功与否的判断
(2)脚本开发规范

一个完整的shell脚本需要有以下几个部分:

脚本名:最好以.sh结尾
第一行:#!/bin/bash
指定解释器:由哪个程序来执行脚本内容
#!:幻数
/bin/bash:指定解释器,指定由哪个程序来执行脚本
注意:#!/bin/bash必须写在第一行,否则会被认为是注释
有用户判断,否则任何用户都可以执行这个脚本
有流程控制,否则只是把简单的命令进行顺序操作,没有成功与否的判断
注释:可以在命令后添加,也可以自成一行(方便他人查看)

标准脚本(以清空日志为例)

[root@server mnt]# vim clean.sh
 1 #!/bin/bash    
 2 #Date:     2018-12-22   # 脚本时间
  3 #Author:   zuozhe           # 脚本作者
  4 #Connect:  123@qq.com  # 邮箱
  5 #Desc:     This script is for clean logs  # 脚本说明
  6 #Version:  3.0    # 脚本版本
  7 
  8 LOG_DIR=/var/log
  9 ROOT_UID=0
 10 # 判断是否为超级用户
 11 if [ "$UID" -ne "$ROOT_UID" ];then
 12         echo "Error:you are not permession"
 13         exit 1
 14 fi
 15 # 判断能否进入目录
 16 cd $LOG_DIR || {
 17         echo "Cannot access to directory"
 18         exit 1
 19 }
 20 # 判断日志是否清空
 21 cat /dev/null > messages && {
 22         echo "Logs cleaned up ..."
 23         exit 0
 24 }
 25 echo "Logs cleaned failed ..."
 26 exit 1
测试:
[root@server mnt]# sh clean.sh 
Logs cleaned up ...
[root@server mnt]# cat /var/log/messages   # 查看不到脚本内容,说明脚本执行成功
[root@server mnt]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值