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第一个匹配替换
#patternpattern开头才替换;
%patternpattern结尾才替换;
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表示小写的az, 共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 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。

举个例子:

  1. #!/bin/bash
  2. a=10
  3. 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可以先执行命令,将输出结果暂时保存,在适当的地方输出。

命令替换的语法:

  1. `command`

注意是反引号,不是单引号,这个键位于 Esc 键下方。

下面的例子中,将命令执行结果保存在变量中:

  1. #!/bin/bash
  2. DATE=`date`
  3. echo "Date is $DATE"
  4. USERS=`who | wc -l`
  5. echo "Logged in user are $USERS"
  6. UP=`date ; uptime`
  7. 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"

 

运行结果:

  1. Variable is not set
  2. 1 - Value of var is
  3. Variable is not set
  4. 2 - Value of var is Variable is not set
  5. 3 - Value of var is
  6. This is default value
  7. 4 - Value of var is Prefix
  8. Prefix
  9. 5 - Value of var is Prefix

以上是关于shell 变量替换的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换

Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换

linux里面bash是啥?

bash shell参数展开(Shell Parameter Expansion):替换变量(variable)中的字符串

【exec】shell脚本中的 exec 命令

Linux Shell编程中的特殊符号