Linux鸟哥私房菜有shell吗,鸟哥的 Linux 私房菜 -- 学习 bash shell

变量除了可以直接配置来修改原本的内容之外,有没有办法透过简单的动作来将变量的内容进行微调呢?

举例来说,进行变量内容的删除、取代与替换等!是可以的!我们可以透过几个简单的小步骤来进行变量内容的微调喔!

底下就来试试看!

变量内容的删除与取代

变量的内容可以很简单的透过几个咚咚来进行删除喔!我们使用 PATH 这个变量的内容来做测试好了。

请你依序进行底下的几个例子来玩玩,比较容易感受的到鸟哥在这里想要表达的意义:

范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同

[root@www ~]# path=${PATH}

[root@www ~]# echo $path

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

/usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!

范例二:假设我不喜欢 kerberos,所以要将前两个目录删除掉,如何显示?

[root@www ~]# echo ${path#/*kerberos/bin:}

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

上面这个范例很有趣的!他的重点可以用底下这张表格来说明:

${variable#/*kerberos/bin:}

上面的特殊字体部分是关键词!用在这种删除模式所必须存在的

${variable#/*kerberos/bin:}

这就是原本的变量名称,以上面范例二来说,这里就填写 path 这个『变量名称』啦!

${variable#/*kerberos/bin:}

这是重点!代表『从变量内容的最前面开始向右删除』,且仅删除最短的那个

${variable#/*kerberos/bin:}

代表要被删除的部分,由于 # 代表由前面开始删除,所以这里便由开始的 / 写起。

需要注意的是,我们还可以透过通配符 * 来取代 0 到无穷多个任意字符

以上面范例二的结果来看, path 这个变量被删除的内容如下所示:

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

/usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!

很有趣吧!这样了解了 # 的功能了吗?接下来让我们来看看底下的范例三!

范例三:我想要删除前面所有的目录,仅保留最后一个目录

[root@www ~]# echo ${path#/*:}

/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:

/root/bin <==这两行其实是同一行啦!

# 由于一个 # 仅删除掉最短的那个,因此他删除的情况可以用底下的删除线来看:

# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!

[root@www ~]# echo ${path##/*:}

/root/bin

# 嘿!多加了一个 # 变成 ## 之后,他变成『删除掉最长的那个数据』!亦即是:

# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!

非常有趣!不是吗?因为在 PATH 这个变量的内容中,每个目录都是以冒号『:』隔开的,

所以要从头删除掉目录就是介于斜线 (/) 到冒号 (:) 之间的数据!但是 PATH 中不止一个冒号 (:) 啊!

所以 # 与 ## 就分别代表:

# :符合取代文字的『最短的』那一个;

##:符合取代文字的『最长的』那一个

上面谈到的是『从前面开始删除变量内容』,那么如果想要『从后面向前删除变量内容』呢?

这个时候就得使用百分比 (%) 符号了!来看看范例四怎么做吧!

范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串

[root@www ~]# echo ${path%:*bin}

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

/usr/sbin:/usr/bin <==注意啊!最后面一个目录不见去!

# 这个 % 符号代表由最后面开始向前删除!所以上面得到的结果其实是来自如下:

# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!

范例五:那如果我只想要保留第一个目录呢?

[root@www ~]# echo ${path%%:*bin}

/usr/kerberos/sbin

# 同样的, %% 代表的则是最长的符合字符串,所以结果其实是来自如下:

# /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!

由于我是想要由变量内容的后面向前面删除,而我这个变量内容最后面的结尾是『/root/bin』,

所以你可以看到上面我删除的数据最终一定是『bin』,亦即是『:*bin』那个 * 代表通配符!

至于 % 与 %% 的意义其实与 # 及 ## 类似!这样理解否?

例题:

假设你是 root ,那你的 MAIL 变量应该是 /var/spool/mail/root 。假设你只想要保留最后面那个档名 (root),

前面的目录名称都不要了,如何利用 $MAIL 变量来达成?

答:

题意其实是这样『/var/spool/mail/root』,亦即删除掉两条斜线间的所有数据(最长符合)。

这个时候你就可以这样做即可:

[root@www ~]# echo ${MAIL##/*/}

相反的,如果你只想要拿掉文件名,保留目录的名称,亦即是『/var/spool/mail/root』

(最短符合)。但假设你并不知道结尾的字母为何,此时你可以利用通配符来处理即可,如下所示:

[root@www ~]# echo ${MAIL%/*}

了解了删除功能后,接下来谈谈取代吧!继续玩玩范例六啰!

范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:

[root@www ~]# echo ${path/sbin/SBIN}

/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:

/usr/sbin:/usr/bin:/root/bin

# 这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串

# 后面的是新字符串,所以结果就会出现如上述的特殊字体部分啰!

[root@www ~]# echo ${path//sbin/SBIN}

/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:/SBIN:/bin:

/usr/SBIN:/usr/bin:/root/bin

# 如果是两条斜线,那么就变成所有符合的内容都会被取代喔!

我们将这部份作个总结说明一下:

变量配置方式说明

${变量#关键词}

${变量##关键词}

若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除

若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除

${变量%关键词}

${变量%%关键词}

若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除

若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除

${变量/旧字符串/新字符串}

${变量//旧字符串/新字符串}

若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』

若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

变量的测试与内容替换

在某些时刻我们常常需要『判断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个常用的配置。

我们举底下的例子来说明好了,看看能不能较容易被你所理解呢!

范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root

[root@www ~]# echo $username

<==由于出现空白,所以 username 可能不存在,也可能是空字符串

[root@www ~]# username=${username-root}

[root@www ~]# echo $username

root <==因为 username 没有配置,所以主动给予名为 root 的内容。

[root@www ~]# username="vbird tsai" <==主动配置 username 的内容

[root@www ~]# username=${username-root}

[root@www ~]# echo $username

vbird tsai <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代

在上面的范例中,重点在于减号『 - 』后面接的关键词!基本上你可以这样理解:

new_var=${old_var-content}

新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的

new_var=${old_var-content}

这是本范例中的关键词部分!必须要存在的哩!

new_var=${old_var-content}

旧的变量,被测试的项目!

new_var=${old_var-content}

变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』

不过这还是有点问题!因为 username 可能已经被配置为『空字符串』了!果真如此的话,那你还可以使用底下的范例来给予

username 的内容成为 root 喔!

范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root

[root@www ~]# username=""

[root@www ~]# username=${username-root}

[root@www ~]# echo $username

<==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!

[root@www ~]# username=${username:-root}

[root@www ~]# echo $username

root <==加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!

在大括号内有没有冒号『 : 』的差别是很大的!加上冒号后,被测试的变量未被配置或者是已被配置为空字符串时,

都能够用后面的内容 (本例中是使用 root 为内容) 来替换与配置!这样可以了解了吗?除了这样的测试之外,

还有其他的测试方法喔!鸟哥将他整理如下:

Tips:

底下的例子当中,那个 var 与 str 为变量,我们想要针对 str 是否有配置来决定 var 的值喔!

一般来说, str: 代表『str 没配置或为空的字符串时』;至于 str 则仅为『没有该变量』。559d9acf7915cfdccd64561154a0cd32.gif

变量配置方式str 没有配置

str 为空字符串str 已配置非为空字符串

var=${str-expr}var=exprvar=var=$str

var=${str:-expr}var=exprvar=exprvar=$str

var=${str+expr}var=var=exprvar=expr

var=${str:+expr}var=var=var=expr

var=${str=expr}str=expr

var=expr

str 不变

var=str 不变

var=$str

var=${str:=expr}str=expr

var=expr

str=expr

var=exprstr 不变

var=$str

var=${str?expr}expr 输出至 stderrvar=var=$str

var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str

根据上面这张表,我们来进行几个范例的练习吧! ^_^!首先让我们来测试一下,如果旧变量 (str) 不存在时,

我们要给予新变量一个内容,若旧变量存在则新变量内容以旧变量来替换,结果如下:

测试:先假设 str 不存在 (用 unset) ,然后测试一下减号 (-) 的用法:

[root@www ~]# unset str; var=${str-newvar}

[root@www ~]# echo var="$var", str="$str"

var=newvar, str= <==因为 str 不存在,所以 var 为 newvar

测试:若 str 已存在,测试一下 var 会变怎样?:

[root@www ~]# str="oldvar"; var=${str-newvar}

[root@www ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容

关于减号 (-) 其实上面我们谈过了!这里的测试只是要让你更加了解,这个减号的测试并不会影响到旧变量的内容。

如果你想要将旧变量内容也一起替换掉的话,那么就使用等号 (=) 吧!

测试:先假设 str 不存在 (用 unset) ,然后测试一下等号 (=) 的用法:

[root@www ~]# unset str; var=${str=newvar}

[root@www ~]# echo var="$var", str="$str"

var=newvar, str=newvar <==因为 str 不存在,所以 var/str 均为 newvar

测试:如果 str 已存在了,测试一下 var 会变怎样?

[root@www ~]# str="oldvar"; var=${str=newvar}

[root@www ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容

那如果我只是想知道,如果旧变量不存在时,整个测试就告知我『有错误』,此时就能够使用问号『 ? 』的帮忙啦!

底下这个测试练习一下先!

测试:若 str 不存在时,则 var 的测试结果直接显示 "无此变量"

[root@www ~]# unset str; var=${str?无此变量}

-bash: str: 无此变量 <==因为 str 不存在,所以输出错误信息

测试:若 str 存在时,则 var 的内容会与 str 相同!

[root@www ~]# str="oldvar"; var=${str?novar}

[root@www ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容

基本上这种变量的测试也能够透过 shell script 内的 if...then... 来处理,

不过既然 bash 有提供这么简单的方法来测试变量,那我们也可以多学一些嘛!

不过这种变量测试通常是在程序设计当中比较容易出现,如果这里看不懂就先略过,未来有用到判断变量值时,再回来看看吧! ^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
综合小区管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、车位管理、车位分配管理、出入管理、字典管理、房屋管理、物业费缴纳管理、公告管理、物业人员投诉管理、我的私信管理、物业人员管理、用户管理、管理员管理。用户的功能包括管理部门以及部门岗位信息,管理招聘信息,培训信息,薪资信息等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 综合小区管理系统管理系统可以提高综合小区管理系统信息管理问题的解决效率,优化综合小区管理系统信息处理流程,保证综合小区管理系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理综合小区管理系统信息,包括出入管理,报修管理,报修管理,物业费缴纳等,可以管理操作员。 出入管理界面,管理员在出入管理界面中可以对界面中显示,可以对招聘信息的招聘状态进行查看,可以添加新的招聘信息等。报修管理界面,管理员在报修管理界面中查看奖罚种类信息,奖罚描述信息,新增奖惩信息等。车位管理界面,管理员在车位管理界面中新增。公告管理界面,管理员在公告管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值