Shell变量的取用、删除、取代与替换
<<鸟哥的私房菜>>
注意:
通配符适用的地方:shell命令行或者shell脚本中
正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则。
在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的
而通配符多用在文件名上,比如查找find,ls,cp,等等
#!/bin/bash
path=${PATH}
echo $path
#/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games # #和%的删除功能
echo "#从前往后匹配"
# "#":符合取代文字的『最短的』那一个
# *local/bin: 匹配"/usr/local/sbin:/usr/local/bin:"
# 这里的"*"为通配符,匹配0到无穷多个任意字符
echo ${path#/*local/bin:} # "##":符合取代文字的『最长的』那一个
#删除前面所有的目录,仅保留最后一个目录
echo ${path##/*:} # %从后往前
echo "%从后往前"
echo ${path%:*games} # %%从后往前匹配最长的
echo ${path%%:*games} echo "将path的变量内容内的 sbin 取代成大写 SBIN"
#两斜线中间的是旧字符串,后面的是新字符串
# sh test.sh出现"Bad substitution". bash test.sh和./tesh.sh正常
echo ${path/sbin/SBIN}
# 如果是两条斜线,那么就变成所有符合的内容都会被取代
echo ${path//sbin/SBIN} echo "『判断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个常用的配置。"
echo $username
echo "因为 username 没有配置,所以主动给予名为 root 的内容."
username=${username-root}
echo $username echo "因为 username 已经配置了,所以使用旧有的配置而不以 root 取代"
username="vbird tsai"
username=${username-root}
echo $username echo "若 username 未配置或为空字符串,则将 username 内容配置为 root"
#因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
username=""
username=${username-root}
echo $username echo "加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!"
username=${username:-root}
echo $username
变量的取用: echo
echo $variable
echo $PATH
echo ${PATH}
变量的配置守则
1.变量与变量内容以一个等号『=』来连结,如下所示:
『myname=VBird』
2.等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』
3.变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
『2myname=VBird』
4.变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is \$LANG‘』则得『lang is \$LANG』
5.可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
6.在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
『version=\$(uname -r)』再『echo \$version』可得『2.6.18-128.el5』
7.若该变量为扩增变量内容时,则可用"\$变量"或\${变量} 累加内容,如下所示:
『PATH="$PATH":/home/bin』
PS.我一般用\${变量},在变量拼接的时候尤其重要,name=\$nameyes,name的内容是\$nameyes 这个变量;name=\${name}yes,可以把\$name和yes拼接起来
8.若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
『export PATH』
9.通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
10.取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
『unset myname』
变量内容的删除、取代与替换
范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同
path=${PATH}
echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
范例二:假设要将前两个目录删除掉,如何显示?
echo ${path#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
解释:

范例三:我想要删除前面所有的目录,仅保留最后一个目录
echo ${path##/*:}
/root/bin
多加了一个 # 变成 ## 之后,变成『删除掉最长的那个数据』
- # :符合取代文字的『最短的』那一个;
- ##:符合取代文字的『最长的』那一个
如果想要『从后面向前删除变量内容』呢? 这个时候就得使用百分比 (%) 符号了
范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串
echo ${path%:*bin}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
范例五:那如果我只想要保留第一个目录呢?
echo ${path%%:*bin}
/usr/kerberos/sbin
了解了删除功能后,接下来谈谈取代吧
范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
echo ${path/sbin/SBIN}
/usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串,后面的是新字符串
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
echo $username
<==由于出现空白,所以 username 可能不存在,也可能是空字符串
username=${username-root}
echo $username
root <==因为 username 没有配置,所以主动给予名为 root 的内容。
username="vbird tsai" <==主动配置 username 的内容
username=${username-root}
echo $username
vbird tsai <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代
范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root
username=""
username=${username-root}
echo $username
<==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
username=${username:-root}
echo $username
root <==加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!
| 变量配置方式 | str 没有配置 | str 为空字符串 | str 已配置非为空字符串 |
| var=${str-expr} | var=expr | var= | var=$str |
| var=${str:-expr} | var=expr | var=expr | var=$str |
| var=${str+expr} | var= | var=expr | var=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=expr |
str 不变 var=$str |
| var=${str?expr} | expr 输出至 stderr | var= | var=$str |
| var=${str:?expr} | expr 输出至 stderr | expr 输出至 stderr | var=$str |
Shell变量的取用、删除、取代与替换的更多相关文章
- 常见linux命令释义(第七天)——ulimit 与变量内容的删除替代与替换。
linux是一个多用户多任务的系统,不同于windows的单人多任务操作系统.再linux上,在同一个时间点上,可以有多个人同时执行多个任务. 那么假若有10个用户,同时打开了100个100M的文件. ...
- shell ## %% 变量内容的删除、替代和替换
这个写的很清楚: https://www.cnblogs.com/zhaosunwei/p/6831529.html 自己的理解:以后补充 从前向后删除 # 符合替换字符的“最短的”那个 ## 符合替 ...
- 【Shell】变量的取用、删除、取代与替换
——来自<鸟哥的Linux私房菜> ——总结做方便查阅之用 变量的取用: echo echo $variableecho $PATHecho ${PATH} 变量的配置守则1.变量与变量内 ...
- 变量内容的删除、取代与替换 (Optional)
变量除了可以直接设置来修改原本的内容之外,有没有办法通过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除.取代与替换等!是可以的!我们可以通过几个简单的小步骤来进行变量内容的微调喔! ...
- Linux变量内容的删除、取代与替换
变量内容的删除与取代 范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同 [root@www ~]# path=${PATH} [root@www ~]# echo $path /u ...
- 变量内容的删除、取代与替换(optional)
这部分内容非常繁琐且不易记忆且枯燥,用到来查询即可. 1.变量内容的删除 这一部分比较细枝末节,就不再一一手打了,贴范例图片 #:符合取代文字的最短的一个 ##:符合取代文字的最长的一个 2.变量内容 ...
- shell变量的替换,命令的替换,转义字符
1,shell变量的替换 变量可以根据变量是否为空或者被删除,而被替换为特定的值 ${var} 变量本来的值 $(var:-word) 如果变量为空,或者已被删除那么返回word,但是不改变va ...
- shell变量替换 SHELL字符串处理技巧(${}、##、%%)
在SHELL编程中,经常要处理一些字符串变量.比如,计算长度啊.截取子串啊.字符替换啊等等,常常要用到awk.expr.sed.tr等命令.下面给大家介绍个简单的字符串处理方法,用不着嵌套复杂的子 ...
- [转]shell 变量替换
转自:http://blog.csdn.net/xuhongning/article/details/6191515 1,参数替换: 不含有“:”的,只要定义了,就生效,不管是否为空 含有“:”的,即 ...
随机推荐
- Java的首次学习和了解
先来说说自己对于Java的了解.Java是一种面向对象的语言,而c++则是面向过程的.Java在网页的开发设计制作过程中必不可少,另外我们还可以用它来做手机的移动开发,还有一些基于服务器的架构设计.J ...
- Linux内核分析 读书笔记 (第七章)
第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行. 2.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于 ...
- LINUX内核分析第六周学习总结——进程的描述与创建
LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...
- Github学习心得体会
https://github.com/Accredit/TEST 在本学期第一次接触Github,在系统的学习了Github的使用之后,自己对Github有了一个基本的使用了解.在这个过程中,自己也认 ...
- CentOS 离线安装Gitlab-ce
1. 上gtilab的官网,找了一下安装说明.. 首先安装 依赖的包 sudo yum install -y curl policycoreutils-python openssh-server cr ...
- cerr与cout的区别
1.cout经过缓冲后输出,默认情况下是显示器.可以重定向. 2.cerr不经过缓冲而直接输出,一般用于迅速输出出错信息,不可以被重定向.
- Fantacy团队周一站立会议
词频分析模型 1.首先这次站会是周一开的,但是由于我个人的疏忽,没有落实到博客上,请见谅,连累了组长. 2.会议时间:2016年3月28日12:00~12:30. 持续时长:30分钟 会议参加成员:组 ...
- elk认证模块x-pack安装
一.elasticsearch安装x-pack elasticsearch/bin/elasticsearch-plugin install x-pack ######## -> Downloa ...
- zabbix2.2 - /tmp/FromDualMySQLagent.lock already exists
最近升级了线上的zabbix server版本,升级成功后发现日志中一直报出history和history-uint表的主键冲突数据插入不成功的信息,根据主键冲突发生的itemid去库里查,如下 my ...
- python之查询指定目录下的最新文件
使用os模块查询指定目录下的最新文件 import os # 输入目录路径,输出最新文件完整路径 def find_new_file(dir): '''查找目录下最新的文件''' file_lists ...