一、什么是shell
shell是为了使用户能够操作应用程序的接口程序。如经常使用的图形界面及命令行界面都是shell。下面来介绍一下bash这个shell的功能。
二、变量的概念
被命名的内存空间即为变量,Linux中内置了许多变量,我们可以通过修改这些变量的值还制定用户自己的bash环境。
1、显示变量
使用echo命令来读出变量的内容,PATH是变量的名称,在前面加上$表示读取变量的内容,否则只会显示字串本身,如下所示;
也可以使用下面的方式来读取变量的内容;
2、设置自定义变量
我们也可以自己来设置自定义变量,通过“=”号即可实现;
3、取消变量
三.变量的类型
Linux存在多种不同类型的变量,下面逐一介绍。
1、本地变量
只对当前shell进程有效,对其它shell进程和当前shell进程的子进程无效的变量;
变量的设置规则:
变量的命名应遵循以下原则:
1、只能包含字母语、数字和下划线,并且不能以数字开头;
2、不应该跟系统中已有的环境变量重名;
3、最好做到见名知义;
变量中的引用:
"":弱引用,里面的变量会被替换;
'':强引用,里面的所有字符都是字面量,直接输出;
2、环境变量
环境变量是Linux系统中内置的变量,用于帮助用户设置提示符、文件查找的路径、语系等功能;环境变量作用于当前shell进程及其子进程,对其它的shell无效。
1)查看当前系统上的环境变量
(1)用evn查看环境变量
上面的结果中有些常用的环境变量说明如下:
HOSTNAME:主机名;
SHELL:当前环境中使用的shell程序;
HISTSIZE:记录历史命令的条数,默认为1000;
USER:当前用户名;
MAIL:当前用户的邮箱路径;
PATH:命令查找路径;
LANG:当前语系设置;
HOME:当前用户的家目录。
(2)使用export命令查看环境变量
(3)使用printenv命令查看环境变量
(4)使用set命令查看所有变量
(5)将自定义变量转换成环境变量
脚本在执行时会启动一个子shell进程,而父进程就会处于睡眠状态,等子进程执行完成后再回到父进程继续执行;父进程处于睡眠状态时,子进程不会继承父进程的本地变量,只会继承环境变量,所以必须将脚本中涉及到的本地变量转换成环境变量才能顺利执行。
使用export命令来导出自定义变量为环境变量;
也可直接使用export命令来直接定义环境变量;
(6)修改环境变量
在命令行修改环境变量并不能永久生效,一旦退出shell修改就会失效。
与自定义变量的定义方式相同,可以直接为环境变量赋值;
也可以在环境变量后面追加内容;
自定义提示符
PS1定义了当前shell中的提示符信息,参数含义如下:
\u:当前用户名
\h:主机名
\H:FQDN,完整格式主机名
\w:当前工作目录的基名
\W:当前工作目录的绝对路径
\$:提示符
\t:显示时间
3、局部变量
对shell脚本中某代码片断有效:通常用于函数本地;
定义方法:local VARNAME=VALUE
4、位置变量
$1,$2,…,${10}
5、特殊变量
$?:上一个命令的执行状态返回值
$#:参数个数
$*:参数列表
$@:参数列表
6、只读变量:
readonly VARNAME
四、变量的删除与替换
将路径赋值到变量p中;
${variable#word}:在variable中存储字串上,自左而右,查找第一次出现的word,删除字符开始至此word处的所有内容;
上面的结果表示从左向右查找第一次出现的/,并将其删除;
${variable##word}:在variable中存储字串上,自左而右,查找最后一次出现的word,删除字符开始至此word处的所有内容;
上面的结果表示从左向右查找最后一次出现的/,前面的*代表任何字符;
${variable%word}:在variable中存储字串上,自右而左,查找第一次出现的word,删除word开始到尾部的所有内容;
上面的结果表示从右向左查找第一个/,并将其后面的内容删除;
${variable%%word}:在variable中存储字串上,自右而左,查找最后一次出现的word,删除word开始到尾部的所有内容;
上面的结果表示从右向左查找最后一个/s,并将其后面的内容删除。
变量的查找替换:
${variable/pattern/substi}:将变量中第一次出现的pattern替换为substi;
将第一次出现的123替换为321;
${variable//pattern/substi}:将变量中出现的所有的pattern替换为substi;
${variable/#pattern/substi}:将变量中位于行首的pattern替换为substi;
上面的变量并没有被替换,因为23并是位于行首的字符;
从上面的结果看出只替换了行首的字符;
${variable/%pattern/substi}:将变量中位于行尾的pattern替换为substi;
pattern可以使用globbing中的元字符:*,?
变量的查找删除:
${variable/pattern}:删除pattern第一次匹配到的字符串;
${variable//pattern}:删除pattern所有匹配到的字符串;
${variable/#pattern}:删除pattern匹配到的行首的字符串;
${variable/%pattern}:删除pattern匹配到的行尾字符串;
大小写转换:
小写转大写:${variable^^}
大写转小写:${variable,,}
变量赋值操作:
${parameter:-word}:如果parameter为空或未定义,则返回为“word";否则,返回parameter的值;
因为变量p有值,直接显示变量p的的内容;
将变量p撤消,即显示表达式后面的内容;
${parameter:+word}:如果parameter为空或未定义,则不做任何操作;否则,返回word的值;
此表达式正上面的正好相反,将变量p赋值后显示表达式后面的字符,即tt;
${parameter:=word}:如果parameter为空或未定义,不但变量返回"word";而且将parameter赋值为word;
变量p中有值时,直接显示变量p的值,变量p不存在时,将tt赋值给变量p;
${parameter:offset:length}:如果将parameter偏移offset个字符,并截取length长度的字符
在上面的表达式中,设置了偏移3个字符,即从第4个字符开始显示,截取2个字符,所以结果为45;
${parameter:?word}:如果parameter为空或未定义,则将word做为错误信息显示,否则显示parameter的值;
为脚本使用配置文件,并确保某变量有可用值的方式:
variable=${variable:-default vaule}