shell编程(一)变量

2 篇文章 0 订阅

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/PS2PS1是基本提示符,对于root用户是#,普通用户是$。PS2是附属提示符,默认是“>’’.可以通过修改此环境变量来修改当前的命令符
MALL当前用户的邮件存放目录

五、总结

1、linux shell脚本应该以#!开始,这个机制告诉命令行shell应该选择哪个解释器来解释这个脚本。这种机制提供了一种编程规范,带来脚本的灵活性。例如,你可以选择使用其他语言来编写脚本,比如python
2、Linux shell运行在环境中,环境变量在用户登录启动第一个shell(登录shell)时,从启动文件中读取,不同shell的启动文件不相同,环境变量在运行过程中可以通过export命令改变。Env命令为了运行命令,能够临时创造全新的环境变量
3、Linux shell运行命令时,会创建一个和父进程一样的子进程,子进程的环境变量继承自父进程,所有子进程中对其环境变量的操作都不会影响到父进程。
4、$PATH时Linux环境变量之一,$PATH包含了Linux各个可执行文件所在的目录,当shell接收到命令,发现它不是内部命令,并为给出完整路径时,就会依次在$PATH变量中从前到后搜寻命令文件,直到找到为止
5、可以将环境变量的改变用export写入/etc/profile或者$HOME/.profile中,后者的优先级高于前者。例如
export PATH=$HOME/bin:$PATH,即向 $PATH路径中添加$HME/bin目录,这样,在每次用户登录时都会自动加载环境变量的改变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值