Shell编程基础知识
Posted 尊重工程师的时代,即将到来,愿世界在你们手中更加美好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell编程基础知识相关的知识,希望对你有一定的参考价值。
一.基本的运行Linux程序的3种方法:
(1) 使文件具有可执行权限,直接运行文件。eg: chmod a+x testfile.sh ./testfile.sh
(2) 直接调用命令解释器来执行程序。eg: python testfile.sh (根据文件开头声明的命令解释器进行调用)
(3) 使用source执行文件 eg: source testfile.sh .testfile.sh (t通常用于重新执行刚修改的初始化文件,使之立即生效)
Shell的命令有3种:内建命令,Shell函数和外部命令。
(a).内建命令:Shell程序本身包含的命令,这些命令集成在解释器中。部分内建命令的存在是为了修改Shell的属性设置(环境变量),在执行内建命令的时候,没有进程的消失和创建;另一部分内建命令则是I/O命令,eg. echo命令。
(b).Shell函数就是一系列代码,以Shell函数写成,可以被其他命令引用。
(c).外部命令是独立于shell的可执行程序。例如 find,grep。命令shell在执行外部命令时,会创建一个当前Shell的复制进程来执行。执行过程中,存在进程的创建和消失。(子进程创建初期和父进程一样环境,但是子进程不能改变父进程的参数变量)
外部命令执行过程:
1.调用POSIX系统fork函数接口,创建一个命令行Shell进程的复制(子进程);
2.在子进程的运行环境中,查找外部命令在Linux文件系统中的位置,如果外部命令给出了完全路径,则跳过查找这一步;
3.在子进程里,以新程序取代Shell复制并执行(exec),此时父进程进入休眠,等待子进程执行完毕;
4.子进程执行完毕后,父进程接着从终端读取下一条命令。
二.Linux Shell的变量
Linux shell并不对变量区分类型。一切值都是字符串,并且和变量名一样,值并没有字符长度限制。更加神奇的是,bash也允许比较操作和整数操作。其中关键因素是:变量中的字符串值是否为数字。
单双引号引用问题:单引号是强引用,双引号是弱引用(强引用就是禁止变量替换,弱引用就是可以进行变量替换)
eg:
$var=123 echo ‘$var‘ #此处是单引号,故结果是$var $var echo "$var" #双引号,结果为123 123
在Shell世界中,变量可以是空值("NULL"值),就是不包含任何字符。但是在算术操作中,未初始化的变量为0。
eg:
echo "$uninit" #未初始化变量 #此行为空,没有输出 let "$uninit+=5" #未初始化变量加5 echo "$uninit" 5
Linux Shell中的变量根据影响范围分为两种:局部变量和全局变量。
局部变量:可见范围为代码块或者函数中,且必须用local声明,否在在代码块中,也是全局可见。
全局变量:全局可见,不需要添加修饰词,环境变量是全局变量的一种。
eg:
#! /bin/bash #测试全局变量和局部变量的适用范围 num=123 func1() { num=321 #在代码中声明的变量 echo $num } func2() { local num=456 #声明为局部变量 echo $num } echo $num #显示初始时的num变量 func1() echo $num func2() echo $num
运行结果:
123 321 321 456 321
三.环境变量的相关操作
每次当运行一个Shell时,它都会创建适合自己的环境变量的shell变量。或者更新添加一个新的环境变量的时候,这个Shell都会立即更新它自己的环境,让所有后继子进程都能够继承这个环境变量。
一个脚本只能够export变量到这个脚本所产生的子进程,也就说只能对这个脚本所产生的命令和进程起作用。如果脚本是从命令行中被调用的,那么这个脚本export的变量是不能够影响命令行环境的,即子进程是不能够export变量来影响产生自己的父进程的环境的。但是source命令执行脚本时,因为没有子进程的产生,故可以立即同步执行环境。
export命令用于设置或者显示当前Shell进程的环境变量,作用时间仅仅是当前Shell消亡前。
语法:export [-fnp] [变量名称]=[变量值]
-f:代表[变量名称]中为函数名称。
-n:删除指定的变量。(变量实际上并未删除,只是不输出到后续指令的执行环境中)
-p:列出所有的Shell赋予程序的环境变量。
如若想永久设置环境变量,在启动文件(/etc/profile,/etc/bashrc)相对应的文件中进行设置。
eg:
#设置环境变量PATH
export PATH=/bin:/usr/bin:/usr/local/bin
env命令在未提供command时,显示所有的变量名称和值;提供command时,根据参数重建环境变量后,在新的环境中运行command。
语法:env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
-i:不带环境变量启动(--ignore-environment)
-u:从环境变量中删除一个变量(--unset=NAME)
unset命令从当前Shell删除函数或者变量。
语法:unset [-v] variable..
unset-f function..
-v:默认选项,删除指定的变量。
-f:删除函数操作,参数为函数名称。
Env函数和set函数不同。Env函数显示的环境变量,而set函数显示的是所有本地变量,包括用户定义的变量。
一些常用的环境变量有:
HOME:用户的专属目录,在Linux中用~扩展。
PATH:外部命令的搜索路径。
HISTSIZE:保存历史命令记录的太条数。
LOGNAME:当前用户的登录名。
HOSTNAME:主机的名称。
SHELL:当前用户使用shell的类型。
MAIL:当前用户的邮件存放目录。
LANG/LANGUAGE:语言相关的环境变量,使用多种语言的用户可以修改此变量。
PS1/PS2:PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是负数提示符默认是>。
一般来说,PATH变量中存储路径以:分开,路径中至少包含/bin和/usr/bin这两个目录。当Shell接收到一个命令非内部命令时,也没有给出完整路径时,Shell则在Path变量中从左到右依次搜索目录,如果有一个命令在两个不同目录中都有,则在前面一个会被执行。
以上是关于Shell编程基础知识的主要内容,如果未能解决你的问题,请参考以下文章