shell入门之一

第1章 shell入门

  shell是一个命令解释器,它的操做系统的最外层,负责直接与用户对话,把用户的输入解释给操做系统,并处理各类二样的操做系统的输出结果,输出屏幕返回给用户html

  对话的方式能够是:python

  交互式方式:从键盘输入命令,经过/bin/bash 解析,能够当即获得shell的回应linux

  非交互式方式:脚本nginx

 

1.1 下图就是命令解释器:

 

wKioL1j8pMeDL-4wAACrPDrcFzo181.png-wh_50

 

 

          shell是英文是贝壳的意思,命令解释器shell像一个贝壳同样包住系统核心redis

          shell执行的命令分为两种方式:shell

 

  内置命令:如讲过的cd . pwd exit echo 等命令,当用户登陆系统后,shell以及内置命令就被系统载入到内存,而且一直运行着。编程

  通常命令:如ls,磁盘上的程序文件à调入内存à执行命令vim

 

第2章 什么是shell脚本

  linux命令或语句不在命令行下执行(严格说,命令行也是shell,而是经过一个程序文件执行时,改程序就被称为Shell脚本或shell程序bash

 

  用户能够在shell脚本中敲入一系列的命令及命令语句组合。这些命令,变量和流程控制语句等有机的结合起来久造成一个功能强大的shell脚本less

 

2.1 首先先带领你们写一个清空/var/log/messages日志的脚本

咱们须要先想明白几个问题:

1)   日志文件在哪?
/var/log/messages

2)   用什么命令能够清空文件?
>
重定向

3)   写一个简单的shell脚本。

#!/bin/bash

cd /var/log/

>messages

4)    怎样执行脚本?
[root@kaile ~]# sh /server/scripts/clear.sh

5)   有没有考虑到:

·        有没有脚本放在统一的目录

/server/scripts目录下

·        权限:用哪一个用户执行文件

须要对用户作判断

·     清空错文件怎么办,该如何办?

·     错误提示:有没有成功知不知道?

·     脚本的通用性

2.2范例:包含命令,变量和流程控制的清空/var/log/messages日志的shell脚本

[root@kaile ~]# mkdir -p /server/scripts #要有规范的存放脚本目录

[root@kaile ~]# vim /server/scripts/clear.sh

[root@kaile ~]# cd /server/scripts/

[root@kailescripts]# cat /server/scripts/clear.sh

#!/bin/bash                            #指定解释器

 

LOG_DIR=/var/log                         #设置变量

 

 

if [ "$UID" == "0" ];then       UID等于而后执行下面的命令

 cd $LOG_DIR

 >message

 echo "Logclear yes"

fi
~    

清空日志的三种方法:

echo >test.log

>test.log

cat /dev/null>test.log

#清空内容,保留文件

2.3小结:

·        Shell就是命令解释器。==>翻译官

·        Shell脚本==>命令放在脚本里

2.4Shell脚本在运维工做中的做用地位

  Shell脚本擅长处理纯文本类型的数据,而Linux中几乎全部的配置文件,日志文件等都是纯文本类型文件。

2.5Shell脚本的创建和执行

2.61Shell脚本的创建

推荐使用vim编辑器编辑脚本,能够事先作个别名。

[root@kailescripts]# echo "aliasvi=vim">>/etc/profile

[root@kailescripts]# source /etc/profile

2.7脚本开头第一行

  规范的Shell脚本第一行会指出由哪一个程序(解释器)来执行脚本中的内容。在linux bash编程中通常为:

#!/bin/bash

#!/bin/sh

  其中开头的“#又称为幻数,在执行Shell脚本的时候,内核会根据“#后的解释器来肯定哪一个程序解释脚本中的内容。注意:这一行必须在每一个脚本顶端的第一行,若是不是第一行则为脚本注释行。

2.8shbash的区别

[root@kaile scripts]# ll /bin/sh

lrwxrwxrwx. 1 rootroot 4 Dec 2320:25 /bin/sh -> bash

  #shbash的软连接,推荐标准写法#!/bin/bash

能够看一下系统自带的脚本的写法

head -1 /etc/init.d/*

2.93 bash版本

[root@kailescripts]# bash --version

GNU bash,version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

Copyright (C) 2009 FreeSoftware Foundation, Inc.

License GPLv3+:GNU GPL version3or later <http://gnu.org/licenses/gpl.html>

 

This is freesoftware; you are free to changeand redistribute it.

There isNOWARRANTY, to the extent permitted by law.

2.103.1.4 bash漏洞【破壳漏洞】

若是是比较老的系统,须要注意shell的版本过低,有漏洞,须要升级shell

[root@kailescripts]# yum -y update bash

#验证方法

[root@kailescripts]# env x='(){ :;};echo be careful' bash -c"echo this is a test"

thisis a test

若是返回2

    be careful

    thisis a test

这样的结果的话,请尽快升级

2.11不一样语言脚本的开头写法

#!/bin/sh

#!/bin/bash

#!/usr/bin/awk

#!/bin/sed

#!/usr/bin/tcl

#!/usr/bin/expect

#!/usr/bin/perl

#!/usr/bin/env python

  若是脚本开头不指定解释器,就要用对应的解释器执行脚本。例如bashtest.shpython.test.py

  要求:养成一个好习惯,开头加上相应的解释器标识。

2.12脚本注释

  Shell脚本中,跟在#后面的内容表示注释。注释部分不会被执行,仅给人看。注释能够自成一行,也能够跟在命令后面,与命令同行。要养成写注释的习惯,方便本身与他人。

  最好不用中文注释,由于在不一样字符集的系统会出现乱码。

2.13Shell脚本的执行

2.14Shell脚本执行的四种方式

  1)bash scripts-namesh script-name(推荐使用)

这种方法是当脚本自己没有可执行权限时常使用的方法。

  2path/script-name ./scripts-name(全路径或当前路径执行脚本)
这种方法首先须要给脚本文件可执行权限。

  3sourcescripts-name.scripts-name #注意“.”点号,且点号后有空格。
source .在执行这个脚本的同时,能够将脚本中的函数和变量加载到当前Shell。不会产生子shell。又有点像nginxinclude功能。

2.15Shell脚本开发的规范和习惯

1)开头指定脚本解释器
2
)开头加版本版权等信息,可配置~/.vimrc文件自动添加
3)
脚本不要用中文注释,尽可能用英文注释
4
)脚本以.sh为扩展名
5
)放在统一的目录
6
)代码书写优秀习惯
a,
成对的内容一次性写出来,防止遗漏,如[],'',""
b,[]
两端要有空格,先输入[]退格,输入2个空格,再退格写。
c

流程控制语句一次书写完,再添加内容。

if条件

    then

      内容

fi

d,经过缩进让代码易读
f
,脚本中的引号都是英文状态下的引号,其余字符也是英文状态。

好的习惯可让咱们避免不少没必要要的麻烦,提升工做效率。

第3章 Shell环境变量

3.1什么是变量

  变量就是用一个固定的字符串(也多是字符数字等的组合),替代更多更复杂的内容,这个内容里可能还会包含变量和路径,字符串等其余内容。变量的定义是存在内存中。

x=1

y=2

x变量   一个=赋值   ==相等

 

定义变量三种方法 

自定义变量 

read  变量 

参数变量  

3.2变量类型

  变量分为两类:
1环境变量(也可称为全局变量);能够在建立他们的Shell及派生出来的子shell中使用。环境变量又能够分为自定义环境变量和bash内置的环境变量。

  2局部变量(普通变量):只能在建立他们的shell函数或shell脚本中使用,还记得前面的$user咱们建立的通常都是普通变量。

3.3环境变量

·        环境变量用于定义Shell的运行环境,保证Shell命令的正确执行,Shell经过环境变量来肯定登陆用户名,命令路径,终端类型,登陆目录等,全部的环境变量都是全局变量,可用于全部子进程中,包括编辑器,shell脚本和各种应用。但crond计划任务除外,还须要从新定义环境变量。

·        环境变量能够在命令行中设置,但用户退出时这些变量值也会丢失,所以最好在用户家目录下的.bash_profile文件中或全局配置/etc/bashrc,/etc/profile文件或者/etc/profile.d/目录中定义。将环境变量放入profile文件中,每次用户登陆时这些变量值都将被初始化。

·        一般,全部环境变量均为大写。环境变量应用于用户进程前,都应该用export命令导出。例如:exportclear=1

·        有一些环境变量,好比HOMEPATHSHELLUIDUSER等,在用户登陆以前就已经被/bin/login程序设置好了。一般环境变量定义并保存在用户家目录下的.bash_profile/etc/profile文件中。

3.3.1 #显示环境变量

[root@kailescripts]# echo $HOME

/root

[root@kailescripts]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@kailescripts]# echo $SHELL

/bin/bash

[root@kailescripts]# echo $UID

0

[root@kailescripts]# echo $USER

root

 

3.3.2查看系统环境变量

[root@kailescripts]# env #查看系统环境变量

HOSTNAME=kaile

SELINUX_ROLE_REQUESTED=

TERM=xterm-256color

SHELL=/bin/bash

HISTSIZE=500

SSH_CLIENT=192.168.197.149592 22

SELINUX_USE_CURRENT_RANGE=

OLDPWD=/root

SSH_TTY=/dev/pts/1

LC_ALL=C

USER=root

#中间省略部份内容....

MAIL=/var/spool/mail/root

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PWD=/server/scripts

LANG=zh_CN.UTF-8

SELINUX_LEVEL_REQUESTED=

HISTCONTROL=ignoredups

SHLVL=1

HOME=/root

LOGNAME=root

CVS_RSH=ssh

SSH_CONNECTION=192.168.197.149592 192.168.197.133 22

LESSOPEN=||/usr/bin/lesspipe.sh%s

G_BROKEN_FILENAMES=1

_=/bin/env

3.3.3 #当前终端变量

[root@kailescripts]# echo $PS1

[\u@\h \W]\$

3.4局部变量

定义局部变量

局部变量在用户当前的shell生存期的脚本中使用。例如,局部变量clear取值为clear098,这个值只在用户当前shell生存期中有意义。若是在shell中启动另外一个进程或退出,局部变量clear值将无效。

普通字符串变量定义

变量名=value

变量名=‘value’

变量名=“value”

shell中变量名及变量内容的要求

·     通常是字母,数字,下划线组成,且以字母开头。如clearkaile23clear-training。变量的内容,可使用单引号或双引号印起来,或不加引号。

·     虽然变量能够如下划线开头,但相似这种变量都是比较特殊的,都是系统本身用的。咱们尽可能少用。

[root@kaile scripts]# _123=eeee
[root@kaile scripts]# echo $_123
eeee

普通字符串变量定义测试

[root@kaile scripts]# a=192.168.1.2
[root@kaile scripts]# b='192.168.1.2'
[root@kaile scripts]# c="192.168.1.2"
[root@kaile scripts]# echo "a=$a"
a=192.168.1.2
[root@kaile scripts]# echo "b=$b"
b=192.168.1.2
[root@kaile scripts]# echo "c=${c}"
c=192.168.1.2
[root@kaile scripts]# a=192.168.1.2-$a
[root@kaile scripts]# b='192.168.1.2-$a'
[root@kaile scripts]# c="192.168.1.2-$a"
[root@kaile scripts]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@kaile scripts]# echo "b=$b"
b=192.168.1.2-$a
[root@kaile scripts]# echo "c=${c}"
c=192.168.1.2-192.168.1.2-192.168.1.2

把一个命令作为变量

[root@kailescripts]# ls

clear.sh  clear_log.sh

[root@kaile scripts]# CMD=`ls`

[root@kailescripts]# echo $CMD

clear.shclear_log.sh

[root@kailescripts]# CMD1=$(pwd)

[root@kailescripts]# echo $CMD1

/server/scripts

变量名=`ls` <==反引号
变量名=$(ls)

小结:

1CMD=lsls两侧的符号是键盘tab键上面的,不是单引号。
2
)在变量名前加$,能够取得此变量的值,使用echoprintf命令能够显示变量的值,$A$(A)写法不一样,效果同样,推荐后面的写法。
3
${WEEK}DAY若变量和其余字符组成新的变量就必须给变量加上大括号{}.
4)
养成将全部字符串变量用双引号括起来使用的习惯,减小编程遇到的怪异错误。“$A”“${A}”

3.5变量名及变量内容定义小结

1.         变量名只能由字母,数字,下划线组成,且以字母开头。

2.         规范的变量名写法定义:见名知意
a,ClearAge=1 <==
每一个单词首字母大写
b,clear_age=1 <==
每一个单词之间用“-”
c
clearAgeSex=1<==驼峰语法:首个单词字母小写,其他单词首字母大写

3.  =号的知识,a=1中的等号是赋值的意思,比较是否是相等为“==”

4.         打印变量,变量名前接$符号,变量名后接字符的时候,要用大括号括起来

[root@kaile ~]# word="big"

[root@kaile ~]# echo ${word}ger

bigger

[root@kaile ~]# echo $wordger

 

1.  注意变量内容引用方法,通常为双引号,简单连续字符能够不加引号,但愿原样输出,使用单引号。

2.  变量内容是命令,要用反引号``或者$()把变量括起来使用


Shell脚本能够提升咱们平常工做的效率 。 

学好一门编程语言  多练 多敲 多思考 再练 在思考 。。。。。

相关文章
相关标签/搜索