shell 变量替换
Posted 502203305
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 变量替换相关的知识,希望对你有一定的参考价值。
替换
格式: $parameter/pattern/string
$parameter/pattern/string
$parameter//pattern/string
说明
pattern
的扩展和filename expansion
一样;
parameter
则是直接替换; 并且pattern
最长匹配的字符串被替换成string
; 即贪婪模式;
pattern
正则后续介绍;
/pattern
表示所有匹配都替换; 贪婪模式;
pattern
第一个匹配替换
#pattern
以pattern
开头才替换;
%pattern
以pattern
结尾才替换;
string
为空表示删除匹配;
shopt -s nocasematch
不区分大小写;
parameter
是@, *
, 则对所有的函数参数挨个处理; 结果是list
类型;
var[@], var[*]
同理, 对每个参数替换, 返回仍是list
;
匹配大小写
格式
$parameter^pattern
$parameter^^pattern
$parameter,pattern
$parameter,,pattern
说明
功能是将paramter
中匹配pattern
的首字母大写或小写;
pattern
的正则类似file
^
大写, ,
小写;
单个^,
只匹配一个就终止, 两个则是匹配所有;
同样@*
会对每个都进行处理并返回对应类型;
正则
说明
非特殊字符表示本身, 特殊字符表示集合; \\
则转义, 特殊符号将变成本身;
*
任意字符字符串, 包括空字符;
*
不匹配/
, **
匹配/
; **/
仅匹配文件夹;
?
匹配任意单个字符
[...]
字符表示本身
a-z
, -
表示区间; 包含;
!^
表示对罗列集合取反;
集合和所在地区有关, 因为地区不同, 范围内的字符不同, 比如a-z
表示小写的a
到z
, 共26
个字符, 而有的国家则是52
, 因为他们的排列是aAbBcC...Zz
这种;
特殊集合[:class:]
# 后面两种格式少见, 有得甚至不识别;
[:class:] [=class=] [.class.]
# class 可以下面的任意一个
alnum
alpha
ascii
blank
cntrl
digit
graph
lower
print
punct
space
upper
word
xdigit
复合, shopt -s extglob
打开才能使用
可以多个正则; |
分隔;
?(pattern-list)
Matches zero or one occurrence of the given patterns.
*(pattern-list)
Matches zero or more occurrences of the given patterns.
+(pattern-list)
Matches one or more occurrences of the given patterns.
@(pattern-list)
Matches one of the given patterns.
!(pattern-list)
Matches anything except one of the given patterns.
注: 不好用建议用sed
正则替换更优; 或者python re
;
https://www.gnu.org/software/sed/manual/
https://docs.python.org/3.8/library/re.html
Shell替换:Shell变量替换,命令替换,转义字符
如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。
举个例子:
- #!/bin/bash
- a=10
- echo -e "Value of a is $a \n"
运行结果:
Value of a is 10
这里 -e 表示对转义字符进行替换。如果不使用 -e 选项,将会原样输出:
Value of a is 10\n
下面的转义字符都可以用在 echo 中:
转义字符 | 含义 |
---|---|
\\ | 反斜杠 |
\a | 警报,响铃 |
\b | 退格(删除键) |
\f | 换页(FF),将当前位置移到下页开头 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符(tab键) |
\v | 垂直制表符 |
可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。
命令替换
命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。
命令替换的语法:
- `command`
注意是反引号,不是单引号,这个键位于 Esc 键下方。
下面的例子中,将命令执行结果保存在变量中:
- #!/bin/bash
- DATE=`date`
- echo "Date is $DATE"
- USERS=`who | wc -l`
- echo "Logged in user are $USERS"
- UP=`date ; uptime`
- echo "Uptime is $UP"
运行结果:
Date is Thu Jul 2 03:59:57 MST 2009 Logged in user are 1 Uptime is Thu Jul 2 03:59:57 MST 2009 03:59:57 up 20 days, 14:03, 1 user, load avg: 0.13, 0.07, 0.15
变量替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值
可以使用的变量替换形式:
形式 | 说明 |
---|---|
$var | 变量本来的值 |
$var:-word | 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
$var:=word | 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
$var:?message | 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。 若此替换出现在Shell脚本中,那么脚本将停止运行。 |
$var:+word | 如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
请看下面的例子:
1 #!/bin/bash 2 3 echo $var:-"Variable is not set" 4 echo "1 - Value of var is $var" 5 6 echo $var:="Variable is not set" 7 echo "2 - Value of var is $var" 8 9 unset var 10 echo $var:+"This is default value" 11 echo "3 - Value of var is $var" 12 13 var="Prefix" 14 echo $var:+"This is default value" 15 echo "4 - Value of var is $var" 16 17 echo $var:?"Print this message" 18 echo "5 - Value of var is $var"
运行结果:
- Variable is not set
- 1 - Value of var is
- Variable is not set
- 2 - Value of var is Variable is not set
- 3 - Value of var is
- This is default value
- 4 - Value of var is Prefix
- Prefix
- 5 - Value of var is Prefix
以上是关于shell 变量替换的主要内容,如果未能解决你的问题,请参考以下文章
Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换
Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换
bash shell参数展开(Shell Parameter Expansion):替换变量(variable)中的字符串