背景概述

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_单引号

shell所需要的技术基础

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_bash_02

第1章什么是shell

shell是一个命令解释器,非编译语言,弱类型语言(无需定义变量类型就可以使用)作用是解释执行用户输入的命令等,把用户的输入解释给操作系统。

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_bash_03

shell分类

Bourne shell
C shell
脚本语言:解释执行
PHP语言:是脚本语言,也是网页程序语言。针对于Web页面开发
Perl语言: 小白与大佬差距太大
Python语言:市场过饱
shell:偏向处理系统底层业务,系统内部的很多应用都是shell语言开发
PHP优势在于小型网站开发,Python:开发较复杂的运维工具,web界面管理工具和web业务开发等,Java优势在于大型网站开发。

脚本书写

1.脚本开头第一行:

第一行:#!/bin/bash          < -------------指定解释器
除第一行:#!/bin/bash < -------------注释

2.脚本不加,命令行用bash a.sh执行,也说明用bash解释器

3. ./a.sh 默认也是bash。Linux默认是bash

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_环境变量_04

脚本的五种脚本执行方法

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_单引号_05


【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_单引号_06

[root@web01 ~]# cat test.sh
user=`whoami`
[root@web01 ~]#

[root@web01 ~]# sh test.sh
[root@web01 ~]# echo $user

[root@web01 ~]# . test.sh
[root@web01 ~]# echo $user

子shell和父shell的理解:

命令行本身就是父shell,当你使用sh/bash执行一个脚本的时候,其实已经是在子shell中进行执行,这时候,你在执行脚本中定义的变量,在父shell中,用echo 是输出不出来结果的。
在父shell中定义的非普通变量,则可以调用到子shell中进行使用。(特殊变量$?属于特殊规则)
子shell不继承父进程普通变量,环境变量会被继承

子Shell从父Shell继承得来的属性如下:

1.当前工作目录
2.环境变量
3.标准输入、标准输出和标准错误输出
4.所有已打开的文件标识符
5.忽略的信号

子Shell不能从父Shell继承的属性,归纳如下:

1.除环境变量和.bashrc文件中定义变量之外的Shell变量
2.未被忽略的信号处理

$ (commond)

它的作用是让命令在子shell中执行
​​​commond​​​ 和$(commond)差不多。
【这里的“ ` ”符号是撇(反单引号),不是单引号,是键盘上Esc按键下面的那个键。】

[root@gjt scripts]# echo $b

[root@gjt scripts]# echo $a

[root@gjt scripts]# cat test1.sh
export a=haha
echo "test1: $a"
echo "test1: $b"
sh /root/scripts/test2.sh

[root@gjt scripts]# cat test2.sh
echo "test2:$a"
echo "test2:$b"

[root@gjt scripts]# export b=gaga
[root@gjt scripts]# sh test1.sh
test1: haha
test1: gaga
test2:haha
test2:gaga

#输出说明,父shell定义的全局变量可以传递给子shell以及子shell的子shell

验证:在子shell中调用父shell定义的export全局变量

1)时间充裕 的情况下要加#!/bin /bash
2)编辑/etc/vimrc设置版权信息等(后面会讲到)
3)脚本内容尽量不要出现中文(字符集问题,词汇量)
4)脚本拓展名.sh
5)脚本应存放在固定路径下,例如/server/scripts
6)成对的符号一次性打全,然后进行操作,防止遗漏,比如{}()“” ‘’``

第三章 shell变量

变量名:

不能数字开头,字母,数字大小写下划线
declear可以确定变量类型

变量分类:

环境变量(全局变量)和普通变量(局部变量)

环境变量:

内置环境变量:
满足系统需要,自身存在的变量,大写,所有的用户下都可以生效。例如UID USER SHELL等,特点:都是大写字母
用env set

自定义环境变量:

方法1:
export OLDBOY=1
echo $OLDBOY
1
方法2:
OLDGIRL=2
export OLDGIRL
echo $OLDGIRL
2
方法3:
declare -x OLD=3
echo $OLD

永久生效见下图:

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_环境变量_07

unset可以取消环境变量:

用法:unset OLDBOY

环境变量知识小结:

1.变量名通常大写
2.变量可以在自身的shell以及子shell中使用
3.常用export来定义环境变量
4.执行env默认可以显示环境变量名称及对应值
5.输出环境变量可用“$变量名”
6.书写定时任务要注意,脚本中用到的环境变量最好在shell脚本中重新定义
7.如果希望永久生效可以放在用户环境变量文件或者全局环境变量文件里

shell的登录三种方式

系统登录后默认运行的shell
非登录交互式运行shell
执行脚本运行非交互shell

实践变量赋值三种方式:

[root@web01 ~]# a=1
[root@web01 ~]# echo $a
1
[root@web01 ~]# b="1-$a"
[root@web01 ~]# echo $b
1-1
[root@web01 ~]# c='1-$b'
[root@web01 ~]# echo $c
1-$b
[root@web01 ~]# c="1-$b"
[root@web01 ~]# echo $c

局部变量定义及赋值小结:
定义:

变量内容为连续的数字或者字符串时赋值,变量内容两边可以不加引号
变量的内容很多,有空格且希望解析内容中变量,加“”
希望原样输出变量的内容是就用单引号,
反引号将赋值的命令括起来例如a=`ls`
[root@web01 ~]# a=`ls`
[root@web01 ~]# echo $a
07-if单分支.txt anaconda-ks.cfg gao oldboy.sh test1.sh test.sh xxx 新手安装Vmware虚拟机常见问题.pdf
[root@web01 ~]# ls
07-if单分支.txt gao test1.sh xxx
[root@web01 ~]# a=$(ls)
[root@web01 ~]# echo $a

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_bash_08

echo "today is `date`"         <--------解析命令后输出

【Linux中高级运维: 第51天——Shell编程】第1章:Shell脚本编程基础_环境变量_09


普通变量定义规则:

OldboyAge=1     每个单词首字母大写的定义写法
oldboy_age=1 单词之间用下划线
oldboyAgeSex=1 驼峰语法:首个单词的首字母小写,其余单词首字母大写
OLDBOYAGE=1 单词全大写的定义写法

记忆技巧:

1.变量名
组成,定义规范
2.等号
赋值 等号两边不能有空格
3.变量内容
单引号 双引号 反引号 无引号
4.输出变量内容
变量名加$符号,如果变量后面有内容,用{}引用变量部分
单引号 双引号 反引号 无引号
用echo或者printf

课后题:
1.用source执行脚本和用bash执行有什么区别
2.如何自定义环境变量
3.定义变量内容,不加引号,单引号 ,双引号 ,反引号结果有什么不同?应该怎么用?