变量内容的删除与替换
其中关键字是可以使用 * 来作为通配符(0到无穷个任意字符)
${变量#关键字}
若变量的内容从头开始符合“关键字”,则将符合的最短数据删除${变量##关键字}
若变量的内容从头开始符合“关键字”,则将符合的最长数据删除${变量%关键字}
若变量的内容从尾部开始符合“关键字”,则将符合的最短数据删除${变量%%关键字}
若变量的内容从尾部开始符合“关键字”,则将符合的最长数据删除${变量/旧字符串/新字符串}
若变量的内容符合旧字符串,则第一个旧字符串会被替换为新字符串${变量//旧字符串/新字符串 }
若变量的内容符合旧字符串,则所有旧字符串会被替换为新字符串
其实很好记忆,就是,**# 表示从左到右,%表示从右到左,/ 表示替换,类似于Sed中的替换语法。**双个符号叠加,表示作用范围扩大(匹配由最短–> 最长,替换由单个–> 全部)。
很多时候我们关注的可能是变量的头部和尾部字符串,配合 * 通配符可以很容易实现“字符串的匹配删除”:
- 删除变量的头部到关键词之间到内容,eg.
${变量#*关键字}
- 删除变量从关键词到尾部之间的内容,eg.
${变量%关键字*}
- 替代变量的头部到关键词之间到内容,eg.
${string/#substring/replacement}
,个人感觉和默认效果表现一致(可忽略) - 替代变量的关键词到尾部之间到内容,eg.
${string/%substring/replacement}
举例说明:
➜ ~ string="abcab abcab"
# 删除举例
➜ ~ echo ${string#ab}
cab abcab
➜ ~ echo ${string#*ab}
cab abcab
➜ ~ echo ${string##*ab}
➜ ~ echo ${string%ab}
abcab abc
➜ ~ echo ${string%ab*}
abcab abc
➜ ~ echo ${string%%ab*}
# 替换举例
➜ ~ echo ${string/ab/ef}
efcab abcab
➜ ~ echo ${string//ab/ef}
efcef efcef
➜ ~ echo ${string/#ab/ef}
efcab abcab
➜ ~ echo ${string/%ab/ef}
abcab abcef
字符串截取
有如下3种方式:
- 使用
${}
表达式,使用格式,${var:起始位置:长度}
;编号从0开始,可省略 。 - 使用
expr substr
,使用格式expr substr "$var" 起始位置 长度
;起始位置编号从1开始。 - 使用 cut工具,使用格式
echo $var | cut -b 起始位置-结束位置
;起始位置编号从1开始。
下面举例说明:(从abcdefg 字符串中,截取 ab 子串)。
[root@9ead543f165e /]# echo ${string:0:2}
ab
[root@9ead543f165e /]# expr substr $string 1 2
ab
[root@9ead543f165e /]# echo $string | cut -b 1-2
ab
变量初值处理
对变量的非空情况做处理
-
取值,
${var:-word}
, 若变量var已存在且非null,则返回$var的值;否则返回字串"word",变量var值不变。 用途: 如果变量没定义返回默认值。 -
赋值,
${var:=word}
, 若变量var已存在且非null,则返回$var的值;否则返回字串"word",并赋值给变量var。 用途: 如果变量没定义给变量赋值。 -
有值时提示,
${var:+"提示信息"}
,若变量var已存在且非null,则给出提示,否则返回NUll(空值)。 用途 : 测试变量是否定义。 -
无值时提示,无值时提示,
${var:?"提示信息"}
,若变量var已存在且非null,则返回$var的值。否则给出提示信息(若省略,则用默认提示)。用途: 捕捉由于变量未定义所导致的错误
判断是否以某些字符开头
==比较
使用bash检查字符串是否以某些字符开头可以使用==比较
[[ $str == h* ]]
示例
str="hello"
if [[ $str == h* ]];
then
echo 'yes'
fi
有两个地方需要注意:
h*
不需要使用引号括起来,使用引号括起来是直接做相等比较- 比较语句使用双中括号括起来,而不是使用单中括号
=~正则比较
如果使用Bash的正则
str="hello"
if [[ "$str" =~ ^he.* ]]; then
echo "yes"
fi
使用正则匹配字符串的开头字符需要注意:
he*
:不要使用he*
,这里的*
号表示e字符0到多个,即h,以及heeee都是测试通过的he.*
:这里只允许包含he的字符串通过测试^he.*
:这个表示是以he开头的字符串通过检测
Shell $0, $#, $*, $@, $?, $$和命令行参数
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n
表示,例如,$1
表示第一个参数,$2
表示第二个参数,依次类推。
$*
和 $@
的区别
$*
和 $@
都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1
", “$2
”, …,"$n
" 的形式输出所有参数。但是当它们被双引号(" “)包含时,”$*
" 会将所有的参数作为一个整体,以"$1 $2 … $n
"; 的 形 式 输 出 所 有 参 数 ;而"$@" 不变仍然能够分开各个参数。
参考资料