shell编程
一、简单入门
1、编写一个echo.sh
#!/bin/sh
cd /tmp
echo 'hello word!!'
2、执行
#1 sh执行
sh echo.sh
#2 赋权限直接执行
chmod +x echo.sh
./echo.sh
# source 执行
source echo.sh
小总结:linux程序的3种执行方式
1)使文件具有执行权限,直接执行
2)直接调用命令解释器执行程序
3)使用source执行文件(运行结果跟前两种不同,会改变目录)
小思考:为什么source的执行与前两种不同
前两种方式都会创建shell的子进程,子进程执行将结果传递给父进程,然后消亡,自然父进程的文件目录不会改变,而source不会创建子进程,而是在父进程中直接执行。
小tips:
# 1、#!/bin/more
在README文件的开头加上#!/bin/more,赋予执行权限后,文件中会自动列出自己的内容
二、shell的命令种类
1、内建命令
内建命令就是shell程序本身包含的命令,这些命令集成在shell解释器中,例如,几乎所有的shell解释器中都 包含cd内建命令来改变工作目录。部分内建命令的存在是为了改变shell本身的属性设置,在执行内建命令时,没有进程的创建和消亡;另一部分内建命令则是I/O命令,如echoml
2、shell函数
shell函数是一系列程序代码,以shell语言写成,它可以像其他命令一样被引用。
3、外部命令
外部命令是独立于shell的可执行程序,如find、grep,echo.sh,命令行shell在执行外部ml是,会创建一个当前shell的复制进程来执行。在执行过程中,存在进程的创建和消亡,外部命令的执行过程如下
1)调用POSIX系统fork 函数接口,创建一个命令行shell进程的复制(子进程)
2)在子进程的运行环境中,查找外部命令在linux文件系统中的位置,如果外部命令给出了完全路径,则略过查找这一步
3)在子进程里,以新程序取代shell拷贝并执行(exec),此时父进程进入休眠,等待子进程执行完毕
4)子进程执行完毕后,父进程接着从终端读取下一条命令
三、linux shell的变量
1、变量
shell变量的名称,以一个字母或下划线符号开始,后面可以接人意长度的字母、数字或下划线。shell变量名称字符没有长度限制;不区分变量类型,一切值都是字符串;允许进行比较操作和整数操作
变量的赋值方式
变量名称=值 #等号两边不要有空格当赋值的内容包含空格时,请加引号
$名称。#获取值,
2、引号问题
被一对双引号(" ")括起来的变量替换不会被阻止,所有双引号被称为“部分引用”,也称“弱引用”
单引号(’ '),变量替换就会被禁止了,变量名只会被解释成字面的意思,不会发生变量替换,所以单引号被称为“全引用”,也称为“强引用”
>>>var=123
>>>echo '$var'
$var
>>>echo "$var"
123
#单引号中的$var没有被替换成变量值123,也就是说,变量替换被禁止了;而双引号的值发生变量替换。
## 补充
shell中的变量值可以是空,null
3、shell的变量类型:
局部变量:局部变量的可见范围是代码块或函数中,局部变量必须明确以local声明,否则在代码块中也是全局可见的
全局变量(环境变量):全局范围内可见,在声明的时候,不需要加任何修饰词
注意:函数内部的变量如果没有用local声明,就全局变量,修改后能影响外部的全局变量,这一点跟python区分清楚,python正相反,函数内部的变量都是局部变量,只有关键字global声明的才是全部变量
4、用echo输出变量
#描述
#主要参数
参数 -n 不输出行尾的换行符
#行为模式
echo将各个参数打印到标准输出,单数间以一个空格隔开,在输出结束后,换行,会解释每个字符里的转义序列(escape sequences).转义序列可以用来表示特殊字符,以及控制其行为模式
#警告
echo命令的-n选项并不被所有linux版本支持。POSIX标准并为包含此选项
\b | 退格符(backspace) |
---|---|
\c | 禁止尾随,这个字符后面的所有字符(包括换行符都会被忽略掉,不打印) |
\f | 换页符(清除屏幕) |
\n | 换行符(newline) |
\r | 回车符(carriage return) |
\t | 水平制表符(horizontal tab) |
\v | 垂直制表符(vertical tab) |
\\ | 反斜线 |
5、export输出环境变量
# 语法
export [-fnp][变量名称]=[变量设置值]
# 描述
export命令用于设置或显示环境变量
# 主要选项
-f 代表[变量名称]中为函数名称
-n 删除指定的变量。变量实际上并为删除,只是不会输出到后续指令的执行环境中
-p 列出所有的shell赋予程序的环境变量
# 行为模式
export 命令修改当前shell进程的环境变量,若将export命令置于脚本中被调用执行,则export命令对父shell进程的环境变量没有影响
# 警告
shell中执行程序时,shell会提供一组环境变量。export可新增、修改或删除环境变量,工后续执行的程序使用。export的效力仅及于此登录操作
export命令用于设置当前进程的环境变量,但是有效期仅维持到当前进程消亡位置。下次重新登录到命令行shell时,以前对shell的export设置都无法恢复。如果想要把对环境变量的设置永久保存,则可以将export命令设置于shell登录时执行的启动文件,例如
# 设置环境变量PATH
export PATH=/bin:/usr/bin:/usr/x11R6/bin:/usr/local/bin
# 启动文件包含别名和环境变量,正是这些别名和环境变量才使得shell可以作为一个用户shell来运行,当系统初始化之后,这些别名和变量也可以被其他的shell脚本调用
6、bash的启动文件
启动文件/登出文件 | 描述 |
---|---|
/etc/profile | 系统范围的默认值,大部分用来设置环境(所有的sh衍生出的shell适用) |
/etc/bashrc | 特定于Bash的,系统范围函数与别名 |
$HOME/.bash_profile | 用户定义的,环境默认设置,在每个用户的home目录下都可找到(本地副本保存在/etc/profile) |
$HOME/.bashrc | 用户定义的Bash初始化文件,可以在每个用户的home目录下找到(本地副本保存在/etc/bashrc):只有交互式的shell和用户脚本才会读取这个文件 |
$HOME/.bash_logout | 登出文件、用户定义的指令文件,可在每个用户的home目录下找到:在登出(Bash)shell的时候,这个文件中的命令会得到执行 |
此处的$HOME环境变量,$HOME变量的值是登录着的用户目录。$HOME目录下存放有许多用户个人相关的文件和数据,还有对用户定制的配置文件。这些配置文件往往以 . 开头,表示隐藏文件,使用 ls -a 可查看,在我的阿里云机器上,$HOME的环境变量是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWnop2st-1574405157954)(/Users/bobwang/Library/Application Support/typora-user-images/image-20191122134352351.png)]
7、变量的删除和函数删除
# 删除变量 -v
>>var=1
>>echo $var
1
>>unset -v var
>>echo $var
Null(实际无任何显示)
#删除函数 -f
>>enset -f func
四、shell中一些常见环境变量
变量名 | 描述 |
---|---|
HOME | 用户的专属目录,在Linux中用~扩展 |
PATH | 外部命令的搜索路径 |
HISTSIZE | 保存历史命令记录的条数 |
LOGNAME | 当前用户的登录名 |
HOSTNAME | 主机名称 |
SHELL | 当前用户使用的shell类型 |
LANG/LANGUAGE | 语言相关的环境变量,使用多种语言的用户可以修改此环境变量 |
PS1/PS2 | PS1是基本提示符,对于root用户是#,普通用户是$。PS2是附属提示符,默认是“>’’.可以通过修改此环境变量来修改当前的命令符 |
MALL | 当前用户的邮件存放目录 |