Shell编程

什么是Shell ?

1. Shell脚本语言是实现Linux/Unix系统管理及自动化运维所必须的重要工具,Linux系统的底层以及基础应用软件的核心大都涉及Shell脚本的内容。

2. 一个合格的Linux系统管理员都必须熟练编写Shell脚本语言,从而提升运维人员的工作效率,减少不必要的重复性工作。

1. Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,处理操作系统的输出结果,然后反馈给用户。

2. Shell是一个命令解释器,它的作用是解释并执行用户输入的命令和程序等,用户每输入一条命令,Shell解释器就执行一条,存在一种交互的方式。

3. 从开机准备输入用户名和密码,到登录成功,所有的操作都是Shell解释并执行的。

Shell脚本

1. 当命令或者程序语句不是在命令行中执行,而是通过一个程序文件来执行时,这个程序就称作Shell脚本。

2. 把所有命令放入一个文件,堆积起来后就是一个脚本文件!注意文件的可执行权限,与用户身份.
# 清除/var/log下的messages脚本日志文件
cd /var/log
cat /dev/null > messages
echo "Logs cleaned up . done"

Shell脚本语言的种类

1. Shell脚本语言是弱类型语言(无须定义变量的类型即可使用)

2. 在Linux中有两大Shell,一是Bourne shell,二是C shell

3. 标准shell: Bourne Again shell(bash)

4. 查看Centos 7 系统的 Shell, 其他脚本语言: python、Perl、php
cat /etc/shells

/bin/sh       	# 最常用的shell, 指向/bin/bash
/bin/bash     	# 默认的shell解释器
/sbin/nologin 	# 禁止用户登录
/usr/bin/sh 
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh       # tcsh是csh的增强版
/bin/csh        # 如同C语言的shell

5. Shell脚本语言优势在于处理系统底层的业务,基于linux命令处理也是最快的,常用语开发自动化安装,监控报警,软件启动等脚本。

执行Shell脚本的方式

# 编写shell脚本开头

#!/bin/bash
#!/usr/bin/env python

一个规范的脚本文件会在第一行指出由哪个程序来执行脚本的内容,必须位于第一行!!!如果你不加默认也会交给bash解释,良好的编程习惯,最好加上开头解释器语言标识

执行Shell脚本

1. 此方法是脚本没有可执行权限时,或者文件头没指定解释器时用的方法
bash  # 脚本名
sh    # 脚本名

2. 此方法需要脚本有可执行权限: chmod +x scriptName
path/scriptName
./scriptName 

3. 加载并执行脚本文件中的命令和语句
source scriptName
. scriptName

示例:

#!/bin/bash
echo 'chaoge nb'

[root@python /]#sh test.sh
chaoge nb

[root@python /]#. test.sh
chaoge nb

[root@python /]#source  test.sh
chaoge nb

# 添加可执行权限给test.sh
chmod +x test.sh
./test.sh

变量

1. 环境变量一般指的是export内置命令导出的变量,用于定义Shell的运行环境。

2. Shell通过环境变量来确定命令提示符,也就是前面说的PS1变量

3. 环境变量可以在命令行中设置和创建,但是用户退出命令行时变量值就会丢失,因此可以写入/etc/profile文件中,每次用户登录时,变量都会被初始化!

4. 环境变量名字均大写,用env查看

设置登录的提示

[root@python ~ ]# cat /etc/motd
'welcome chaoge bakcome~~~~~~~~~'

yudanL:~ yuchao$ ssh root@192.168.11.11
Last failed login: Wed Aug 29 11:20:20 CST 2018 from 111.231.199.24 on ssh:notty
There were 25 failed login attempts since the last successful login.
Last login: Wed Aug 29 10:45:51 2018 from 223.72.74.11
'welcome chaoge bakcome~~~~~~~~~`'

定义变量

变量定义的注意点: 
    - 变量名和等号之间不能有空格
    
    - 命名只能用英文字母,数字,下划线,首个字符不能用数字
    
    - 不能用标点符号
    
    - 不能用关键字
name='jason'
echo $name
echo ${name}      # 帮助解释器识别变量的边界
name='jason1234'  # 变量重新赋值
1. 设置只读变量
[root@python ~]# readonly name
[root@python ~]# name='jason'
-bash: name: 只读变量

2. 删除变量
unset name

3. 变量类型
	局部变量: 在脚本或命令中定义,仅在当前shell有效
	环境变量: 所有的程序,shell程序都能访问环境变量
	shell变量: 特殊变量 既有环境变量 又有局部变量

字符串

1. 字符串可以用单引号,也可以用双引号,也可以没引号
[root@python ~]# addr='beijing'
[root@python ~]# echo $addr
beijing

单引号的任何字符串都会原样输出,单引号字符串中的变量无效

单引号字符串不能出现单一的单引号,转义符也不可用,可用作字符串拼接


1. 双引号: 双引号里可以用变量、可以有转义符

[root@python ~]# addr='beijing'
[root@python ~]# name='jason'
[root@python ~]# message="Hello,${name},Your addr is \"${addr}\" "
[root@python ~]# echo $message
Hello,jason,Your addr is "beijing"

切片操作

1. 左闭又开规则

[[root@python ~]# str='I am jason,hello world!'
# 取出0和10索引的字符
[root@python ~]# echo ${str:0:9}
I am jason

2. 查找字符索引 (包括空格)
[root@python ~]# str='I am jason,hello world!'
[root@python ~]# echo `expr index "$str" s`
8

3. 获取字符串长度 (包括空格)

[root@python ~]# str='abc'
[root@python ~]# echo ${#str}
3
posted @ 2019-07-01 16:27  言值  阅读(208)  评论(0编辑  收藏  举报